匹配 rails 路由约束中的双斜杠
Match double slash in rails route constraint
假设我希望 url 作为我路线的一部分 - 可能是回调 url 或类似的 - 我可能会使用以下路线:
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/
(一个斜杠)。我该如何纠正这个问题?正则表达式是错误的还是我必须设置一些标志?
我不认为“http://www.myapp.com/mymodel/http://www.google.co.uk/”是有效的 url。
通常,如果你想传递一个 url 作为参数,你会先调用 CGI.escape
,这会将 "http://www.google.co.uk/"
转换为 "http%3A%2F%2Fwww.google.co.uk%2F"
CGI.escape 会将任何字符串变成自身的 url 安全版本,基本上替换任何在 url 中具有特殊功能的字符,例如“:/?&”以及 space 和一些其他字符,否则会破坏格式。
因此,您最终会得到一个 url,例如
"http://www.myapp.com/mymodel/http%3A%2F%2Fwww.google.co.uk%2F"
这将通过参数
params = {:url => "http://www.google.co.uk/"}
请注意它是如何在此处未转义的:Rails 自动* 在将参数值放入 params
哈希之前调用 CGI.unescape
。
然而,这 url
"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 会这样做,但这可能取决于具体情况。试试吧。
...原来请求在发送之前未在客户端编码,解决方案是在发送之前在 url 上使用 encodeURIComponent()
。
假设我希望 url 作为我路线的一部分 - 可能是回调 url 或类似的 - 我可能会使用以下路线:
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/
(一个斜杠)。我该如何纠正这个问题?正则表达式是错误的还是我必须设置一些标志?
我不认为“http://www.myapp.com/mymodel/http://www.google.co.uk/”是有效的 url。
通常,如果你想传递一个 url 作为参数,你会先调用 CGI.escape
,这会将 "http://www.google.co.uk/"
转换为 "http%3A%2F%2Fwww.google.co.uk%2F"
CGI.escape 会将任何字符串变成自身的 url 安全版本,基本上替换任何在 url 中具有特殊功能的字符,例如“:/?&”以及 space 和一些其他字符,否则会破坏格式。
因此,您最终会得到一个 url,例如
"http://www.myapp.com/mymodel/http%3A%2F%2Fwww.google.co.uk%2F"
这将通过参数
params = {:url => "http://www.google.co.uk/"}
请注意它是如何在此处未转义的:Rails 自动* 在将参数值放入 params
哈希之前调用 CGI.unescape
。
然而,这 url
"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 会这样做,但这可能取决于具体情况。试试吧。
...原来请求在发送之前未在客户端编码,解决方案是在发送之前在 url 上使用 encodeURIComponent()
。