2012-11-02 6 views

Antwort

69

Aus SEO-Sicht ist der gleiche Link mit trailing slash anderen als Link ohne es. Es wird dringend empfohlen, immer ein Schema zu verwenden (mit oder ohne Trails).

Obwohl es verschiedene Schulen gibt, die eine besser ist, ist es am wichtigsten, eine 301-Weiterleitung von "falscher" URL zur richtigen zu machen. Sie können es im Spiel mit einem '' ziemlich einfach erreichen.

Persönlich bevorzuge ich un-trailed-Version, vielleicht, weil die Implementierung in das Play ist nur wie das Schreiben von ein paar einfache Zeilen. In Ihre Routen diese Regel-Datei, irgendwo am Anfang (halten den Slash - es ist wichtig, da es nicht so weiter Schrägstrich im Spanning-Gruppe betrachtet hat, und erlaubt es, schleppte URLs leicht zusammenpassen):

GET /*path/ controllers.Application.untrail(path: String) 

dann Sie kann nur eine Umleitung in der Steuerung machen - zum param, so wird es am Ende ohne Schrägstrich:

Java

public static Result untrail(String path) { 
    return movedPermanently("/" + path); 
} 

Scala

def untrail(path: String) = Action { 
    MovedPermanently("/" + path) 
} 

Bis jetzt werden alle Routen, die mit dem Schrägstrich enden, auf die nicht gezogene Version umgeleitet. Einfach :)

Natürlich ist es sehr empfehlenswert, Reverse-Router für die Generierung von korrekten URLs zu verwenden - redundante Redirects zu minimieren. Auch wenn Sie die URL irgendwo fest codieren (zB in einigen JS oder in einer externen Anwendung), ist es auch besser, die richtigen zu schreiben, anstatt sie jedes Mal zu konvertieren. Wenn Sie planen, eine öffentliche API zu veröffentlichen, notieren Sie in der Dokumentation, welches Muster Ihre Anwendung bevorzugt, damit Entwickler gewarnt werden und (möglicherweise) korrekte Aufrufe vorbereiten.

Was mehr ist - es am wichtigsten für GET Routen, da sie Manipulation von der Client-Seite sind. Bei der Verwendung von POST, PUT, DELETE und anderen brauchen Sie (oder besser gesagt, Sie sollten nicht) sich um Redirects kümmern, da sie vom Benutzer nicht geändert werden können und auf diese Weise müssen Sie sich daran erinnern, welchen Weg Sie wählen. Bei falschem Anruf, dh. für POST, geben Sie einfach einen Fehler 404 zurück - so wird der Entwickler der 3. Teilanwendung verpflichtet, korrekte Endungen zu verwenden.

+0

sehr gute Antwort, ich werde es versuchen ... – opensas

+1

Danke. Und in Scala sieht das so aus: def untrail (Pfad: String) = Aktion {MovedPermanently ("/% s" .format (Pfad))} –

+0

@ChristopherMartin, danke, ich habe deine Probe in die Antwort kopiert – biesior

0

Fügen Sie den Eintrag zweimal in Ihre Routendatei ein. Einer mit dem Schrägstrich und einer ohne.

+0

nun, ja, das ist die Problemumgehung, die ich bisher gefunden habe, ich versuche nur, meine Routen sauber zu halten – opensas

+0

Verdoppelung ist eine schlechte Sache – mmmbell

+0

@ygra Warum danke, das war konstruktiv. –

7

Ich habe mit etwas einfallen lassen, gelang es, wie ich gehofft nicht so einfach war, aber es ist keine Raketenwissenschaft entweder

import play.api.mvc.RequestHeader 

import play.api.Play.current 

class NormalizedRequest(request: RequestHeader) extends RequestHeader { 

    val headers = request.headers 
    val queryString = request.queryString 
    val remoteAddress = request.remoteAddress 
    val method = request.method 

    val path = request.path.stripSuffix("/") 
    val uri = path + { 
    if(request.rawQueryString == "") "" 
    else "?" + request.rawQueryString 
    } 
} 

object NormalizedRequest { 
    def apply(request: RequestHeader) = new NormalizedRequest(request) 
} 

ans dann so verwende ich es in Global.scala

override def onRouteRequest(request: RequestHeader): Option[Handler] = { 
    super.onRouteRequest(NormalizedRequest(request)) 
} 
+2

Beispiele für globale Abfangen in der Praxis sind wenige und weit zwischen, +1 für eine reale Welt Fall – virtualeyes

1

Dieses auf opensas's answer basiert, vereinfacht nur ein bisschen spielen eingebauten in copy Verfahren auf RequestHeader so, dass alle Dinge in der ursprünglichen RequestHeader gehalten werden, wie id, Tags, Version, sicher, usw.

wiederzuverwenden
import play.api.GlobalSettings 
import play.api.mvc.{Handler, RequestHeader} 

trait TrailingSlashNormaliser extends GlobalSettings { 

    def removeTrailingSlash(origReq: RequestHeader): RequestHeader = { 
    if (origReq.path.endsWith("/")) { 
     val path = origReq.path.stripSuffix("/") 
     if (origReq.rawQueryString.isEmpty) 
     origReq.copy(path = path, uri = path) 
     else 
     origReq.copy(path = path, uri = path + s"?${origReq.rawQueryString}") 
    } else { 
     origReq 
    } 
    } 

    override def onRouteRequest(request: RequestHeader): Option[Handler] = 
    super.onRouteRequest(removeTrailingSlash(request)) 

} 

/** 
* Global object that removes trailing slashes from requests. 
*/ 
object Global extends TrailingSlashNormaliser 
+1

'if (origReq.path.endsWith ("/") && origReq.path! ="/") {' – radekg

5

das Beispiel von @opensas und @lloydmeta für das Spiel 2,5

/** 
    * HttpRequestHandler that removes trailing slashes from requests. 
    */ 
class TrailingSlashNormaliserHttpRequestHandler(router: Router, errorHandler: HttpErrorHandler, configuration: HttpConfiguration, filters: HttpFilters) extends HttpRequestHandler { 

    private val default = new DefaultHttpRequestHandler(router, errorHandler, configuration, filters) 

    override def handlerForRequest(request: RequestHeader): (RequestHeader, Handler) = { 
    default.handlerForRequest(removeTrailingSlash(request)) 
    } 

    private def removeTrailingSlash(origReq: RequestHeader): RequestHeader = { 
    if (origReq.path.endsWith("/") && origReq.path != "/") { 
     val path = origReq.path.stripSuffix("/") 
     if (origReq.rawQueryString.isEmpty) { 
     origReq.copy(path = path, uri = path) 
     }else { 
     origReq.copy(path = path, uri = path + s"?${origReq.rawQueryString}") 
     } 
    } else { 
     origReq 
    } 
    } 
} 

https://www.playframework.com/documentation/2.5.x/ScalaHttpRequestHandlers siehe Aktualisiert Eine Anleitung, wie Sie den Handler

anzuwenden