如何在 Play 2.0 中路由网址,使其对结尾斜杠无动于衷



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

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

当前不支持此操作,并且已将票证提交给问题跟踪器。谷歌群组上也有关于这方面的讨论(包括一些变通办法)。

希望这将很快以某种明智的方式实现。

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

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

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

(Jacob可能会迟到,但有些人可能会觉得这很有用)

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

我在我的路线的末尾放了下面一行(这样,它匹配与其他任何内容都不匹配的URL)

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

这是我的申请。appendSlash:

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

您可能想将404未找到视图添加为notFound()的参数

希望这能帮助

Davide

编辑:只有一件事:这将适用于常见的浏览器导航(如果有人键入url但忘记了尾部的"/"),但它不适用于ajax或其他方式的自动请求:为此,您必须键入完整的url。

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

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

routes文件只有没有尾部斜杠的route。。。

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

这里有一个类似的问题:播放framework2:从url中删除尾部斜杠

相关内容

最新更新