匹配rails路由约束中的双斜杠

时间:2015-07-06 11:19:11

标签: ruby-on-rails regex routes

假设我期待一个网址作为我的路线的一部分 - 可能是回调网址或类似网址 - 我可能会使用以下路线:

get '/mymodel/:url', to: 'mycontroller#docallback', url: /.*/

现在我希望能够转到http://www.myapp.com/mymodel/http://www.google.co.uk/并在mycontroller中处理http://www.google.co.uk/ - 但它会被处理为http:/www.google.co.uk/(一个斜杠)。我怎么能纠正这个?正则表达式是错误的还是我必须设置一些标志?

2 个答案:

答案 0 :(得分:3)

我不认为" http://www.myapp.com/mymodel/http://www.google.co.uk/"是一个有效的网址。

通常情况下,如果您想要将网址作为参数传递,请首先在其上调用CGI.escape,这会将"http://www.google.co.uk/"转换为"http%3A%2F%2Fwww.google.co.uk%2F" CGI.escape会将任何字符串转换为网址 - 本身的安全版本,基本上替换任何在网址中具有特殊功能的字符,例如":/?&"还有空格和其他一些会破坏格式的字符。

所以,你最终会得到像

这样的网址
"http://www.myapp.com/mymodel/http%3A%2F%2Fwww.google.co.uk%2F"

将在诸如

之类的参数中出现
params = {:url => "http://www.google.co.uk/"}

请注意它是如何在此处转义的:Rails会自动*在参数值上调用CGI.unescape,然后再将它们放入params哈希值。

然而,这个网址

"http://www.myapp.com/mymodel/http%3A%2F%2Fwww.google.co.uk%2F"

对我来说很奇怪。最好更明确一点,并将其作为url本身的命名参数传递,如

"http://www.myapp.com/mymodel?url=http%3A%2F%2Fwww.google.co.uk%2F"

这需要对您的路线稍作更改。

*认为 Rails会这样做,但可能取决于具体情况。试试吧。

答案 1 :(得分:1)

...结果发出请求在发送之前没有在客户端编码,解决方案是在发送之前在网址上使用encodeURIComponent()