32

Play フレームワーク 1 では、routes ファイルで次のようなものを使用できます ( http://www.playframework.org/documentation/1.2.5/routes#syntaxのドキュメントを確認してください) 。

GET     /clients/?       Clients.index

ルートが /api/clients と /api/clients/ に一致するように

Play フレームワーク 2 で同じことを達成するにはどうすればよいですか?

4

6 に答える 6

71

SEO の観点からは、同じリンクが含まれていてtrailing slashも、含まれていないリンクとは異なります。常に 1 つのスキーマ (追跡リンクまたは非追跡リンク) を使用することを強くお勧めします。

どちらが優れているかはさまざまですが、最も重要なのは、「間違った」URL から正しい URL への 301 リダイレクトを行うことです。「複数の / にまたがる動的部分」を使用すると、Play で非常に簡単に実現できます。

個人的には、un-trailed バージョンの方が好みです。おそらく、Play で実装するのは単純な行をいくつか書くようなものだからです。ルート ファイルの最初のどこかにこのルールを追加します (スラッシュを保持します。これは、スパニング グループの次のスラッシュとは見なされず、後続の URL を簡単に照合できるため重要です)。

GET  /*path/  controllers.Application.untrail(path: String)

then you can just make a redirect in the controller - to the param, so it will be without the slash at the end:

Java

public static Result untrail(String path) {
   return movedPermanently("/" + path);
}

Scala

def untrail(path: String) = Action { 
  MovedPermanently("/" + path)
}

Until now, all routes ending with the slash will be redirected to the un-trailed version. Easy :)

Of course it's highly recommended to use reverse router for generating correct URL's - to minimalize redundant redirects. Also if you're hardcoding the URL somewhere (ie. in some JS or in external application) it's also better to write correct ones instead converting them every time. If you're planning to publish some public API make a note in documentation, which pattern does your application prefer, so developers will be warned and (maybe) will prepare correct calls.

What's more - it most important for GET routes as they are a subject to manipulation from the client's side. While using POST, PUT, DELETE and others you don't need (or rather, you should't) to care about redirects as they can not be changed by the user and in that way you need to remember which way you choose. In case of wrong call ie. for POST, just return a 404 error - so the developer of the 3-rd part application will be obligated to use correct endings.

于 2012-11-02T13:31:08.790 に答える
9

私は何かを思いつくことができました。それは私が望んでいたほど単純ではありませんでしたが、ロケット科学でもありません

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))
}
于 2012-11-02T06:26:34.993 に答える
1

これはopensasの回答に基づいています.Playの組み込みcopyメソッドを再利用するために少し単純化されているため、id、タグ、バージョン、セキュアなど、RequestHeader元のすべてのものが保持されます.RequestHeader

import play.api.GlobalSettings
import play.api.mvc.{Handler, RequestHeader}

trait TrailingSlashNormaliser extends GlobalSettings {

  def removeTrailingSlash(origReq: RequestHeader): RequestHeader = {
    if (origReq.path.endsWith("/")) {
      val path = origReq.path.stripSuffix("/")
      if (origReq.rawQueryString.isEmpty)
        origReq.copy(path = path, uri = path)
      else
        origReq.copy(path = path, uri = path + s"?${origReq.rawQueryString}")
    } else {
      origReq
    }
  }

  override def onRouteRequest(request: RequestHeader): Option[Handler] = 
    super.onRouteRequest(removeTrailingSlash(request))

}

/**
 * Global object that removes trailing slashes from requests.
 */
object Global extends TrailingSlashNormaliser
于 2014-11-12T01:27:37.543 に答える
0

ルート ファイルにエントリを 2 回追加します。スラッシュのあるものとないもの。

于 2012-11-02T04:45:21.333 に答える