匹配 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()