2012-04-04 70 views

Trả lời

6

này hiện không được hỗ trợ và một ticket has been submitted to the issue tracker. Ngoài ra còn có một cuộc thảo luận về điều này (bao gồm cả một số cách giải quyết) trên Google Groups.

Hy vọng điều này sẽ sớm được triển khai một cách thông minh.

+0

Tôi đã đánh dấu bạn là chính xác, tuy nhiên nếu điều này được giải quyết, chúng tôi có thể cập nhật câu trả lời của bạn vào một ngày sau đó. –

5

Nếu bạn đang sử dụng play framework 1.x thì nó là:

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

Cảm ơn, tôi đang sử dụng phiên bản 2, tiếc là đã thêm 2.0 vào tiêu đề. –

+1

Tôi nên thêm, phương pháp này dường như không hoạt động trong Play 2.0 –

3

(Có thể là muộn Jacob, nhưng ai đó có thể tìm thấy điều này hữu ích)

Tôi có vấn đề này là tốt, đây là cách giải quyết của tôi:

tôi đặt ở phần cuối của tuyến đường của tôi dòng sau (điều này bằng cách nào, nó phù hợp với các url đó không phù hợp với bất cứ điều gì khác)

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

Và đây là Application.appendSlash tôi:

public static Result appendSlash(String path) { 
char ending = path.charAt(path.length() -1); 
if (ending != '/') 
    return redirect('/' + path + '/'); 
else 
    return notFound(); 
} 

Bạn có thể muốn thêm xem 404 Not Found của bạn như một paramer để notfound()

Hope this helps

Davide

EDIT: Chỉ cần một điều: điều này sẽ làm việc để điều hướng trình duyệt phổ biến (nếu ai đó gõ url nhưng quên dấu '/'), nhưng nó sẽ KHÔNG làm việc với các yêu cầu tự động ajax hoặc otherways: cho rằng bạn sẽ phải gõ url hoàn chỉnh.

+0

Upvoted anyways, tôi đánh giá cao câu trả lời. –

2

Một khả năng khác là đặt này vào Global-Object của bạn:

Nếu một con đường với một dấu gạch chéo không tìm thấy nó cố gắng một với dấu gạch chéo gỡ bỏ.

Các tuyến đường tập tin chỉ có tuyến đường mà không cần dấu slashes ...

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

Trong khi điều này dường như không được hỗ trợ vào lúc này, nó có thể đạt được bằng cách ghi đè onRouteRequest trong Global.scala

Chúng tôi đang làm nó như thế này:

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) 
    } 

    } 

} 
1

đây là giải pháp tôi đã tìm thấy

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 sau đó tôi sử dụng nó như thế này trong Global.scala

override def onRouteRequest(request: RequestHeader): Option[Handler] = { 
    super.onRouteRequest(NormalizedRequest(request)) 
} 

Và đây là một câu hỏi tương tự: play framework2: remove trailing slash from urls

+0

Có thể giải quyết nó mà không cần chuyển hướng không? – Sergey

Các vấn đề liên quan