玩framework2:删除网址斜线(play framework2: remove trailin

2019-07-03 12:22发布

在播放器框架1,你可以在路由使用的文件是这样的(在检查文档http://www.playframework.org/documentation/1.2.5/routes#syntax )

GET     /clients/?       Clients.index

因此,该航线将匹配/ API /客户,并/ API /客户/

我怎样才能实现在游戏框架2一样的吗?

Answer 1:

从SEO角度有同一链接trailing slash是其他人比没有它的链接。 强烈建议总是使用一个模式(落后或不落后链接)。

虽然有不同的学校,一个是更好地最重要的是实现从“错误”的URL到正确的301重定向。 你可以用“实现其在游戏很容易动力部分跨越几个/ ”。

我个人比较喜欢未落后的版本,也许是因为在游戏执行它就像写几行简单。 添加到您的文件航线这条规则,在开始的地方(保持斜杠 - 这是重要的,因为它不被视为跨越组中下一个斜杠,并允许匹配容易落后的URL):

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

那么你可以做一个控制器中的重定向 - 到帕拉姆,所以这将是结尾没有斜杠:

Java

public static Result untrail(String path) {
   return movedPermanently("/" + path);
}

Scala

def untrail(path: String) = Action { 
  MovedPermanently("/" + path)
}

到现在为止,用斜线结束所有路线将被重定向到未落后的版本。 简单 :)

当然,这是强烈建议使用反向路由器生成正确的URL的 - 到minimalize多余的重定向。 此外,如果你的某个地方硬编码的URL(即在一些JS或外部应用程序),它也更好地写出正确的人每次转换,而不是他们。 如果你打算发布一些公共API请记下文件,其中模式应用程序是否喜欢,所以开发者将受到警告和(也许)将准备正确的电话。

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



Answer 2:

我已经成功地拿出的东西,它并不像我希望的那样简单,但是它没有火箭科学任

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


Answer 3:

通过@opensas和@lloydmeta更新的例子进行播放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
    }
  }
}

看到https://www.playframework.com/documentation/2.5.x/ScalaHttpRequestHandlers关于如何应用处理器指令



Answer 4:

这是基于opensas的回答 ,只是简化了一下重用播放内置的copy上方法RequestHeader ,使所有在原来的东西RequestHeader保持一样的ID,标签,版本,安全,等等。

import play.api.GlobalSettings
import play.api.mvc.{Handler, RequestHeader}

trait TrailingSlashNormaliser extends GlobalSettings {

  def removeTrailingSlash(origReq: RequestHeader): RequestHeader = {
    if (origReq.path.endsWith("/")) {
      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
    }
  }

  override def onRouteRequest(request: RequestHeader): Option[Handler] = 
    super.onRouteRequest(removeTrailingSlash(request))

}

/**
 * Global object that removes trailing slashes from requests.
 */
object Global extends TrailingSlashNormaliser


Answer 5:

在你的路线文件两次添加的条目。 一个以斜杠和一个没有。



文章来源: play framework2: remove trailing slash from urls