在播放器框架1,你可以在路由使用的文件是这样的(在检查文档http://www.playframework.org/documentation/1.2.5/routes#syntax )
GET /clients/? Clients.index
因此,该航线将匹配/ API /客户,并/ API /客户/
我怎样才能实现在游戏框架2一样的吗?
在播放器框架1,你可以在路由使用的文件是这样的(在检查文档http://www.playframework.org/documentation/1.2.5/routes#syntax )
GET /clients/? Clients.index
因此,该航线将匹配/ API /客户,并/ API /客户/
我怎样才能实现在游戏框架2一样的吗?
从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
,因为它们是从客户端操纵对象的路线。 在使用POST
, PUT
, DELETE
等你并不需要(或者说,你should't)关心重定向,因为它们不能被用户以这种方式,你需要记住,你选择哪种方式来改变。 在打错的电话即如此。 对于POST,只是返回404错误 - 这样的3挡部分应用程序的开发者将有义务用正确的结局。
我已经成功地拿出的东西,它并不像我希望的那样简单,但是它没有火箭科学任
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))
}
通过@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关于如何应用处理器指令
这是基于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
在你的路线文件两次添加的条目。 一个以斜杠和一个没有。