Tôi có thể chụp hai tuyến đường sau trong một dòng không?Cách định tuyến URL trong Play 2.0 để chúng không quan tâm đến dấu gạch chéo kết thúc
GET /game controllers.Main.app.gamelist
GET /game/ controllers.Main.app.gamelist
Tôi có thể chụp hai tuyến đường sau trong một dòng không?Cách định tuyến URL trong Play 2.0 để chúng không quan tâm đến dấu gạch chéo kết thúc
GET /game controllers.Main.app.gamelist
GET /game/ controllers.Main.app.gamelist
này hiện không được hỗ trợ và một ticket has been submitted to the issue tracker. Ngoài ra còn có một cuộc thảo luận về điều này (bao gồm cả một số cách giải quyết) trên Google Groups.
Hy vọng điều này sẽ sớm được triển khai một cách thông minh.
Tôi đã đánh dấu bạn là chính xác, tuy nhiên nếu điều này được giải quyết, chúng tôi có thể cập nhật câu trả lời của bạn vào một ngày sau đó. –
Nếu bạn đang sử dụng play framework 1.x thì nó là:
GET /game/? controllers.Main.app.gamelist
Cảm ơn, tôi đang sử dụng phiên bản 2, tiếc là đã thêm 2.0 vào tiêu đề. –
Tôi nên thêm, phương pháp này dường như không hoạt động trong Play 2.0 –
(Có thể là muộn Jacob, nhưng ai đó có thể tìm thấy điều này hữu ích)
Tôi có vấn đề này là tốt, đây là cách giải quyết của tôi:
tôi đặt ở phần cuối của tuyến đường của tôi dòng sau (điều này bằng cách nào, nó phù hợp với các url đó không phù hợp với bất cứ điều gì khác)
GET /*path controllers.Application.appendSlash(path: String)
Và đây là Application.appendSlash tôi:
public static Result appendSlash(String path) {
char ending = path.charAt(path.length() -1);
if (ending != '/')
return redirect('/' + path + '/');
else
return notFound();
}
Bạn có thể muốn thêm xem 404 Not Found của bạn như một paramer để notfound()
Hope this helps
Davide
EDIT: Chỉ cần một điều: điều này sẽ làm việc để điều hướng trình duyệt phổ biến (nếu ai đó gõ url nhưng quên dấu '/'), nhưng nó sẽ KHÔNG làm việc với các yêu cầu tự động ajax hoặc otherways: cho rằng bạn sẽ phải gõ url hoàn chỉnh.
Upvoted anyways, tôi đánh giá cao câu trả lời. –
Một khả năng khác là đặt này vào Global-Object của bạn:
Nếu một con đường với một dấu gạch chéo không tìm thấy nó cố gắng một với dấu gạch chéo gỡ bỏ.
Các tuyến đường tập tin chỉ có tuyến đường mà không cần dấu slashes ...
@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("/");
}
Trong khi điều này dường như không được hỗ trợ vào lúc này, nó có thể đạt được bằng cách ghi đè onRouteRequest trong Global.scala
Chúng tôi đang làm nó như thế này:
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)
}
}
}
đây là giải pháp tôi đã tìm thấy
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)
}
ans sau đó tôi sử dụng nó như thế này trong Global.scala
override def onRouteRequest(request: RequestHeader): Option[Handler] = {
super.onRouteRequest(NormalizedRequest(request))
}
Và đây là một câu hỏi tương tự: play framework2: remove trailing slash from urls
Có thể giải quyết nó mà không cần chuyển hướng không? – Sergey
Có một giải pháp trên Play, 2.x được đăng ở đây: http: // stackoverflow. com/a/13196239/422288 –