【问题标题】:How to Route URLs in Play 2.0 so They're Indifferent to an Ending Slash如何在 Play 2.0 中路由 URL,使其对结尾斜杠无动于衷
【发布时间】:2012-04-04 04:00:34
【问题描述】:

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

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

【问题讨论】:

标签: regex scala playframework routes playframework-2.0


【解决方案1】:

目前不支持此功能,ticket has been submitted to the issue trackerGoogle Groups 上也对此进行了讨论(包括一些解决方法)。

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

【讨论】:

  • 我标记你是正确的,但是如果这个问题得到解决,我们可能应该在以后更新你的答案。
【解决方案2】:

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

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

【讨论】:

  • 谢谢,我用的是第 2 版,哎呀忘了在标题后面加 2.0。
【解决方案3】:

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

  }  

}

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

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

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

      routes 文件只有一个没有尾部斜杠的路由...

      @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("/");
      }
      

      【讨论】:

        【解决方案6】:

        这是我找到的解决方案

        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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-09
          • 1970-01-01
          • 2011-07-24
          • 1970-01-01
          • 2017-05-04
          相关资源
          最近更新 更多