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部分应用程序的开发人员将有义务使用正确的结尾.
我设法想出了一些东西,它并不像我希望的那么简单,但它也不是火箭科学
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)
更新了@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
| 归档时间: |
|
| 查看次数: |
6067 次 |
| 最近记录: |