play framework2:从url中删除尾部斜杠

ope*_*sas 32 routes config playframework-2.0

在play框架1中,你可以在routes文件中使用这样的东西(查看http://www.playframework.org/documentation/1.2.5/routes#syntax上的文档)

GET     /clients/?       Clients.index
Run Code Online (Sandbox Code Playgroud)

这样路由将匹配/ api/clients以及/ api/clients /

如何在Play框架2中实现相同的目标?

bie*_*ior 70

从SEO的角度来看,相同的链接trailing slash是没有它的链接.强烈建议始终使用一个模式(牵引或非牵引链接).

虽然有不同的学校哪一个更好,但最重要的是将301从"错误"的URL重定向到正确的.使用" 动态部分跨越几个/ ",您可以在Play中轻松实现.

我个人更喜欢非拖尾版本,也许是因为在Play中实现它就像写几条简单的线条.添加到你的路线文件这个规则,在开头的某个地方(保留斜线 - 这很重要,因为它不被视为生成组中的下一个斜杠,并允许轻松匹配落后的URL):

GET  /*path/  controllers.Application.untrail(path: String)
Run Code Online (Sandbox Code Playgroud)

然后你可以在控制器中进行重定向 - 到参数,所以它最后没有斜线:

Java

public static Result untrail(String path) {
   return movedPermanently("/" + path);
}
Run Code Online (Sandbox Code Playgroud)

Scala

def untrail(path: String) = Action { 
  MovedPermanently("/" + path)
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,所有以斜杠结尾的路线都将被重定向到非追踪版本.简单 :)

当然,强烈建议使用反向路由器生成正确的URL - 以最小化冗余重定向.此外,如果您在某处(即在某些JS或外部应用程序中)对URL进行硬编码,那么最好还是编写正确的URL,而不是每次都进行转换.如果您计划发布一些公共API在文档中做一个注释,您的应用程序更喜欢哪种模式,那么开发人员将收到警告,并且(可能)将准备正确的调用.

更重要的是 - 它最重要的是GET路线,因为它们受客户方的操纵.当使用POST,PUT,DELETE等你并不需要(或者说,你should't)关心重定向,因为它们不能被用户以这种方式,你需要记住,你选择哪种方式来改变.如果是错误的电话,即.对于POST,只返回404错误 - 因此第3部分应用程序的开发人员将有义务使用正确的结尾.


ope*_*sas 7

我设法想出了一些东西,它并不像我希望的那么简单,但它也不是火箭科学

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)
}
Run Code Online (Sandbox Code Playgroud)

然后我在Global.scala中使用它

override def onRouteRequest(request: RequestHeader): Option[Handler] = {
  super.onRouteRequest(NormalizedRequest(request))
}
Run Code Online (Sandbox Code Playgroud)

  • 在实践中全球拦截的例子很少,在现实世界的情况下为+1 (2认同)

Som*_*tik 6

更新了@opensas和@lloydmeta对于play 2.5的示例

/**
  * HttpRequestHandler that removes trailing slashes from requests.
  */
class TrailingSlashNormaliserHttpRequestHandler(router: Router, errorHandler: HttpErrorHandler, configuration: HttpConfiguration, filters: HttpFilters) extends HttpRequestHandler {

  private val default = new DefaultHttpRequestHandler(router, errorHandler, configuration, filters)

  override def handlerForRequest(request: RequestHeader): (RequestHeader, Handler) = {
    default.handlerForRequest(removeTrailingSlash(request))
  }

  private def removeTrailingSlash(origReq: RequestHeader): RequestHeader = {
    if (origReq.path.endsWith("/") && origReq.path != "/") {
      val path = origReq.path.stripSuffix("/")
      if (origReq.rawQueryString.isEmpty) {
        origReq.copy(path = path, uri = path)
      }else {
        origReq.copy(path = path, uri = path + s"?${origReq.rawQueryString}")
      }
    } else {
      origReq
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

有关如何应用处理程序的说明,请参阅https://www.playframework.com/documentation/2.5.x/ScalaHttpRequestHandlers