12

我可以在一行中捕获以下两条路线吗?

GET     /game                    controllers.Main.app.gamelist
GET     /game/                   controllers.Main.app.gamelist
4

6 回答 6

6

目前不支持此功能,并且已将票证提交给问题跟踪器Google Groups上也有关于此的讨论(包括一些解决方法)。

希望这将很快以某种聪明的方式实施。

于 2012-04-04T08:17:25.517 回答
5

虽然目前似乎不支持,但可以通过覆盖 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)
    }

  }  

}
于 2012-10-18T22:15:50.073 回答
5

如果您使用的是 playframework 1.x,那么它是:

GET /game/? controllers.Main.app.gamelist
于 2012-04-04T04:12:34.657 回答
3

(雅各布可能会迟到,但有人可能会觉得这很有用)

我也遇到了这个问题,我的解决方法是:

我在路由的末尾添加了以下行(这样,它匹配与其他任何内容都不匹配的 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 或其他方式的自动请求:因为你无论如何都必须输入完整的网址。

于 2012-05-06T18:06:10.297 回答
2

另一种可能性是将其放入您的全局对象中:

如果未找到带有尾部斜杠的路由,它会尝试删除尾部斜杠的路由。

路线文件只有路线没有尾随斜杠......

@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("/");
}
于 2012-07-12T15:04:19.290 回答
1

这是我找到的解决方案

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))
}

这是一个类似的问题:play framework2: remove trailing slash from urls

于 2012-11-02T21:37:58.713 回答