2012-04-04 32 views

Respuesta

6

Esto no es compatible actualmente y una ticket has been submitted to the issue tracker. También hay un debate sobre esto (incluidas algunas soluciones) en Google Groups.

Esperamos que esto se implemente de alguna manera inteligente pronto.

+0

Marqué correctamente, sin embargo, si esto se resuelve, probablemente deberíamos actualizar su respuesta en una fecha posterior. –

5

Si está utilizando 1.x playframework entonces es:

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

Gracias, estoy usando la versión 2, whoops se olvidó de agregar 2.0 al título. –

+1

Debo añadir que este método no parece funcionar en Play 2.0 –

3

(podría ser tarde para Jacob, pero alguien podría resultar útil)

tuve este problema también, aquí está mi solución:

que pone al final de mis rutas siguiente línea (esto manera, que coincide con las direcciones URL que no coincidían con ninguna otra cosa)

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

Y es mi Application.appendSlash aquí:

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

Es posible que desee añadir su vista 404 Not Found como paramer a NOTFOUND()

espero que esto ayude

Davide

EDIT: Sólo una cosa: esto funcionará para la navegación del navegador común (si Alguien teclea la URL, pero se olvida del final "/"), pero NO funcionará con ajax ni solicitudes automatizadas de otro tipo: para eso, tendrá que escribir la url completa.

+0

Upvoted de todos modos, agradezco la respuesta. –

2

Otra posibilidad es poner esto en su Global-Objeto:

Si una ruta con una barra al final no se encuentra que trata uno con la barra al final eliminado.

presentar Las rutas solo tiene ruta sin barras al final ...

@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

Si bien esto no parece ser apoyado por el momento, se puede lograr reemplazando onRouteRequest en Global.scala

lo estamos haciendo de esta manera:

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

Aquí está la solución que he encontrado

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 entonces lo uso como este en Global.scala

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

Y he aquí una pregunta similar: play framework2: remove trailing slash from urls

+0

¿Es posible resolverlo sin redirigir? – Sergey

Cuestiones relacionadas