In play framework 1, you could use in the routes file something like this (check documentation at http://www.playframework.org/documentation/1.2.5/routes#syntax)
GET /clients/? Clients.index
so that the route will match /api/clients and also /api/clients/
How can I achieve the same in play framework 2?
The trailing slash does not matter for your root domain or subdomain. Google sees the two as equivalent. But trailing slashes do matter for everything else because Google sees the two versions (one with a trailing slash and one without) as being different URLs.
Email Subscription. A trailing slash is a forward slash (“/”) placed at the end of a URL such as domain.com/ or domain.com/page/. The trailing slash is generally used to distinguish a directory which has the trailing slash from a file that does not have the trailing slash.
String s = "http://almaden.ibm.com/"; s= s. replaceAll("/",""); and this: String s = "http://almaden.ibm.com/"; length = s.
Use the String. replace() method to remove a trailing slash from a string, e.g. str. replace(/\/+$/, '') . The replace method will remove the trailing slash from the string by replacing it with an empty string.
From SEO point of view the same link with trailing slash
is other one than link without it. It is highly recommended to always use one schema (trailed or un-trailed links).
Although there are different schools which one is better the most important is to make a 301 redirect from 'wrong' URL to the correct. You can achieve it quite easy in Play with a 'Dynamic part spanning several /'.
Personally I prefer un-trailed version, maybe because implementing it in the Play is just like writing few simple lines. Add to your routes file this rule, somewhere at the beginning (keep the slash - it's important as it's NOT considered as next slash in the spanning-group, and allows to match trailed URL's easily):
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.
I've managed to come up with something, it wasn't as simple as I hoped, but it's no rocket science either
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 then I use it like this in Global.scala
override def onRouteRequest(request: RequestHeader): Option[Handler] = { super.onRouteRequest(NormalizedRequest(request)) }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With