12

次の2つのルートを1行でキャプチャできますか?

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

6 に答える 6

6

これは現在サポートされておらず、チケットは課題追跡システムに送信されています。これに関する議論(いくつかの回避策を含む)もGoogleグループにあります。

うまくいけば、これはすぐにいくつかのスマートな方法で実装されます。

于 2012-04-04T08:17:25.517 に答える
5

現時点ではこれはサポートされていないようですが、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)
    }

  }  

}
于 2012-10-18T22:15:50.073 に答える
5

playframework 1.xを使用している場合は、次のようになります。

GET /game/? controllers.Main.app.gamelist
于 2012-04-04T04:12:34.657 に答える
3

(ジェイコブに遅れるかもしれませんが、誰かがこれが役に立つと思うかもしれません)

私にもこの問題がありました。回避策は次のとおりです。

ルートの最後に次の行を配置します(このようにして、他のどの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。

于 2012-05-06T18:06:10.297 に答える
2

もう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("/");
}
于 2012-07-12T15:04:19.290 に答える
1

これが私が見つけた解決策です

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から末尾のスラッシュを削除します

于 2012-11-02T21:37:58.713 に答える