2012-04-04 7 views

Antwort

6

Dies wird derzeit nicht unterstützt und ein ticket has been submitted to the issue tracker. Es gibt auch eine Diskussion darüber (einschließlich einiger Problemumgehungen) unter Google Groups.

Hoffentlich wird dies bald auf intelligente Weise umgesetzt werden.

+0

Ich habe Sie korrekt markiert, wenn dies jedoch gelöst wird, sollten wir Ihre Antwort wahrscheinlich zu einem späteren Zeitpunkt aktualisieren. –

5

Wenn Sie playframework 1.x verwenden, dann ist es:

GET /game/? controllers.Main.app.gamelist 
+0

Danke, ich benutze Version 2, Whoops vergessen, 2,0 zum Titel hinzuzufügen. –

+1

Ich sollte hinzufügen, diese Methode scheint nicht in Play 2 zu funktionieren.0 –

3

(Könnte für Jacob spät sein, aber jemand könnte das nützlich finden)

ich auch dieses Problem hatte, hier ist meine Abhilfe:

ich am Ende meiner Routen setzen die folgende Zeile (diese So passt es URLs, die nichts anderes brachte)

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

Und hier ist mein Application.appendSlash:

public static Result appendSlash(String path) { 
char ending = path.charAt(path.length() -1); 
if (ending != '/') 
    return redirect('/' + path + '/'); 
else 
    return notFound(); 
} 

Vielleicht möchten Sie Ihre 404 Not Found Ansicht als paramer zu NOTFOUND()

this helps

Davide

EDIT hinzuzufügen: Nur eine Sache: das funktioniert für gängige Browser-Navigation (falls jemand tippt die URL ein, vergisst aber das abschließende '/'), aber es funktioniert NICHT mit Ajax oder anderen automatisierten Anfragen: dafür müssen Sie sowieso die komplette URL eingeben.

+0

Upsoted sowieso, ich schätze die Antwort. –

2

Ein andere Möglichkeit ist diese in Ihr globale-Objekt zu setzen:

Wenn eine Route mit einem Schrägstrich wird nicht gefunden er versucht, einen mit dem hinteren entfernt Strich.

Die Routen nur Route ohne folgende Schrägstriche hat Datei ...

@Override 
public Result onHandlerNotFound(Http.RequestHeader requestHeader) { 
    if (hasTrailingSlash(requestHeader.path())) { 
     return Action.redirect(removeLastChar(requestHeader.path())); 
    } 
    return super.onHandlerNotFound(requestHeader); 
} 

private static String removeLastChar(String value) { 
    return value.substring(0, value.length() - 1); 
} 

private static boolean hasTrailingSlash(String value) { 
    return value != null && value.endsWith("/"); 
} 
5

Während dies scheint nicht zur Zeit unterstützt werden, können sie durch zwingende onRouteRequest in Global.scala

erreicht werden

Wir machen es so:

import play.api._ 
import play.api.mvc.{Handler, RequestHeader, Action, Controller} 


object TrailingSlashRedirector extends Controller { 
    def redirect(request: RequestHeader) = Action { 
    Redirect(request.path.dropRight(1), request.queryString, 301) 
    } 
} 

object Global extends GlobalSettings { 

    override def onRouteRequest(request: RequestHeader): Option[Handler] = { 

    val EndsWithASlash= """/(.*)/$""".r 

    request.path match { 
     case EndsWithASlash(_) => Some(TrailingSlashRedirector.redirect(request)) 
     case _ => super.onRouteRequest(request) 
    } 

    } 

} 
1

Hier ist die Lösung, die ich

01 gefunden habe

ans dann verwende ich es so in Global.scala

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

Und hier ist eine ähnliche Frage: play framework2: remove trailing slash from urls

+0

Ist es möglich, es ohne Redirect zu lösen? – Sergey

Verwandte Themen