Подтвердить что ты не робот

Как маршрутизировать URL-адреса в Play 2.0, чтобы они были безразличны к завершающему слэшу

Можно ли записать следующие две маршруты в одной строке?

GET     /game                    controllers.Main.app.gamelist
GET     /game/                   controllers.Main.app.gamelist
4b9b3361

Ответ 1

В настоящее время это не поддерживается, и в трекер ошибок отправлен . Существует также обсуждение этого вопроса (включая некоторые обходные пути) в Группах Google.

Надеюсь, это скоро будет реализовано в некотором разумном ключе.

Ответ 2

Если вы используете playframework 1.x, то это:

GET /game/? controllers.Main.app.gamelist

Ответ 3

Пока это не поддерживается в настоящий момент, это может быть достигнуто путем переопределения 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)
    }

  }  

}

Ответ 4

(Может опаздывать на Джейкоба, но кто-то может найти это полезным)

У меня тоже была эта проблема, здесь мой обход:

Я установил в 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-адрес.

Ответ 5

Другая возможность заключается в том, чтобы поместить это в свой Глобальный объект:

Если маршрут с завершающей косой чертой не найден, он пытается удалить один из оставшихся косой черты.

В файле маршрутов есть только маршрут без завершающих слэшей...

@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("/");
}

Ответ 6

Здесь найденное решение

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-адресов