Можно ли записать следующие две маршруты в одной строке?
GET /game controllers.Main.app.gamelist
GET /game/ controllers.Main.app.gamelist
Можно ли записать следующие две маршруты в одной строке?
GET /game controllers.Main.app.gamelist
GET /game/ controllers.Main.app.gamelist
В настоящее время это не поддерживается, и в трекер ошибок отправлен . Существует также обсуждение этого вопроса (включая некоторые обходные пути) в Группах Google.
Надеюсь, это скоро будет реализовано в некотором разумном ключе.
Если вы используете playframework 1.x, то это:
GET /game/? controllers.Main.app.gamelist
Пока это не поддерживается в настоящий момент, это может быть достигнуто путем переопределения onRouteRequest в Global.scala
Мы делаем это так:
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)
}
}
}
(Может опаздывать на Джейкоба, но кто-то может найти это полезным)
У меня тоже была эта проблема, здесь мой обход:
Я установил в END моих маршрутов следующую строку (таким образом, она соответствует URL-адресам, которые не соответствуют чему-либо еще)
GET /*path controllers.Application.appendSlash(path: String)
И вот мой Application.appendSlash:
public static Result appendSlash(String path) {
char ending = path.charAt(path.length() -1 );
if (ending != '/')
return redirect('/' + path + '/');
else
return notFound();
}
Возможно, вы захотите добавить свой 404 Not Found view в качестве параметра для notFound()
Надеюсь, что это поможет
Давида
EDIT: это одно: это будет работать для общей навигации браузера (если кто-то вводит URL-адрес, но забывает о конце '/'), но он НЕ будет работать с автоматическими запросами ajax или другими способами: для этого вам все равно придется введите полный URL-адрес.
Другая возможность заключается в том, чтобы поместить это в свой Глобальный объект:
Если маршрут с завершающей косой чертой не найден, он пытается удалить один из оставшихся косой черты.
В файле маршрутов есть только маршрут без завершающих слэшей...
@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("/");
}
Здесь найденное решение
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, то я использую его вот так в Global.scala
override def onRouteRequest(request: RequestHeader): Option[Handler] = {
super.onRouteRequest(NormalizedRequest(request))
}
И вот аналогичный вопрос: play framework2: удалить завершающий слэш из URL-адресов