¿Puedo capturar las siguientes dos rutas en una sola línea?Cómo enrutar las URL en Play 2.0 para que sean indiferentes a una barra inclinada final
GET /game controllers.Main.app.gamelist
GET /game/ controllers.Main.app.gamelist
¿Puedo capturar las siguientes dos rutas en una sola línea?Cómo enrutar las URL en Play 2.0 para que sean indiferentes a una barra inclinada final
GET /game controllers.Main.app.gamelist
GET /game/ controllers.Main.app.gamelist
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.
Marqué correctamente, sin embargo, si esto se resuelve, probablemente deberíamos actualizar su respuesta en una fecha posterior. –
Si está utilizando 1.x playframework entonces es:
GET /game/? controllers.Main.app.gamelist
Gracias, estoy usando la versión 2, whoops se olvidó de agregar 2.0 al título. –
Debo añadir que este método no parece funcionar en Play 2.0 –
(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.
Upvoted de todos modos, agradezco la respuesta. –
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("/");
}
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)
}
}
}
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
¿Es posible resolverlo sin redirigir? – Sergey
Hay una solución en Play 2.x publicado aquí: http: // stackoverflow. com/a/13196239/422288 –