次の2つのルートを1行でキャプチャできますか?
GET /game controllers.Main.app.gamelist
GET /game/ controllers.Main.app.gamelist
次の2つのルートを1行でキャプチャできますか?
GET /game controllers.Main.app.gamelist
GET /game/ controllers.Main.app.gamelist
これは現在サポートされておらず、チケットは課題追跡システムに送信されています。これに関する議論(いくつかの回避策を含む)もGoogleグループにあります。
うまくいけば、これはすぐにいくつかのスマートな方法で実装されます。
現時点ではこれはサポートされていないようですが、Global.scalaのonRouteRequestをオーバーライドすることで実現できます。
私たちはこのようにそれをやっています:
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)
}
}
}
playframework 1.xを使用している場合は、次のようになります。
GET /game/? controllers.Main.app.gamelist
(ジェイコブに遅れるかもしれませんが、誰かがこれが役に立つと思うかもしれません)
私にもこの問題がありました。回避策は次のとおりです。
ルートの最後に次の行を配置します(このようにして、他のどのURLとも一致しなかった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();
}
notFound()にパラメーターとして404NotFoundビューを追加することをお勧めします
お役に立てれば
ダビデ
編集:1つだけ:これは一般的なブラウザナビゲーションでは機能しますが(誰かがURLを入力したが、末尾の「/」を忘れた場合)、ajaxやその他の自動リクエストでは機能しません:とにかく完全なものを入力する必要がありますurl。
もう1つの可能性は、これをGlobal-Objectに入れることです。
末尾にスラッシュがあるルートが見つからない場合は、末尾にスラッシュが削除されたルートを試します。
ルートファイルには、末尾にスラッシュがないルートが含まれています...
@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))
}
同様の質問があります:framework2を再生します:URLから末尾のスラッシュを削除します