我可以在一行中捕获以下两条路线吗?
GET /game controllers.Main.app.gamelist
GET /game/ controllers.Main.app.gamelist
我可以在一行中捕获以下两条路线吗?
GET /game controllers.Main.app.gamelist
GET /game/ controllers.Main.app.gamelist
目前不支持此功能,并且已将票证提交给问题跟踪器。Google Groups上也有关于此的讨论(包括一些解决方法)。
希望这将很快以某种聪明的方式实施。
虽然目前似乎不支持,但可以通过覆盖 Global.scala 中的 onRouteRequest 来实现
我们这样做是这样的:
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)
}
}
}
如果您使用的是 playframework 1.x,那么它是:
GET /game/? controllers.Main.app.gamelist
(雅各布可能会迟到,但有人可能会觉得这很有用)
我也遇到了这个问题,我的解决方法是:
我在路由的末尾添加了以下行(这样,它匹配与其他任何内容都不匹配的 url)
GET /*path controllers.Application.appendSlash(path: String)
这是我的 Application.appendSlash:
public static Result appendSlash(String path) {
char ending = path.charAt(path.length() -1 );
if (ending != '/')
return redirect('/' + path + '/');
else
return notFound();
}
您可能希望将 404 Not Found 视图作为参数添加到 notFound()
希望这可以帮助
戴维德
编辑:只有一件事:这将适用于常见的浏览器导航(如果有人键入了 url 但忘记了尾随的 '/'),但它不适用于 ajax 或其他方式的自动请求:因为你无论如何都必须输入完整的网址。
另一种可能性是将其放入您的全局对象中:
如果未找到带有尾部斜杠的路由,它会尝试删除尾部斜杠的路由。
路线文件只有路线没有尾随斜杠......
@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("/");
}
这是我找到的解决方案
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)
}
然后我在 Global.scala 中像这样使用它
override def onRouteRequest(request: RequestHeader): Option[Handler] = {
super.onRouteRequest(NormalizedRequest(request))
}