假设我期待一个网址作为我的路线的一部分 - 可能是回调网址或类似网址 - 我可能会使用以下路线:
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/
(一个斜杠)。我怎么能纠正这个?正则表达式是错误的还是我必须设置一些标志?
答案 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()
。