我想要什么
我想传递带有编码斜杠的 URL 段。
问题
- 在 Thin 上本地运行,有效
- 在 Passenger/Nginx/Rack 上的服务器上运行,它中断了
- 之前有东西解码斜线 它到达 Rails
我的问题
- 允许参数包含斜线的最佳方式是什么?
我尝试过的
- 为边界处的特殊字符更改“/” - “!”例如。这很困惑,会导致应用程序其他区域出现其他问题
- 根据 https://serverfault.com/questions/459369/disabling-url-decoding-in-nginx-proxy 更改 Nginx 配置
- 为乘客找到了这个:https://golem.ph.utexas.edu/wiki/instiki/show/Run+on+Port+80
- 这表明
PassengerAllowEncodedSlashes on
可能会解决这个问题,但犹豫是否这样做会影响安全性
细节
routes.rb
get '/api/shops/:city', to: 'shops#index', constraints: /[0-9A-Za-z\-\.\%\s]+/
表格
用户可以从下拉列表中选择他们的区域:
London/Dover
Glasgow/Edinburgh
提交时
我们通过以下方式访问 API:/api/shops/London%2FDover
出于显而易见的原因,我们在构建 url 时对斜线进行了编码。
这有效...
在 Rails on Thin 上本地运行。
URL 被路由识别,斜杠在 Rails 内部解码,在我们的应用程序中,我们将 London/Dover 作为参数。
这打破了...
在 Nginx、Passenger 和 Rack 上的服务器上运行。
斜线在到达 Rails 之前被解码。
/api/shops/London/Dover
不是路线,因此以 404 响应。
版本
- 乘客 3.0.2
- Nginx 1.2.9
- 机架 1.2(1.5 版)
- rails 3.2.17
最佳答案
我们遇到了同样的问题。我们尝试使用 CGI::escape 、URI::encode、ERB::Util::url_encode 对字符串进行编码,但在使用 passenger 和 nginx 的服务器上没有任何效果。 对我们有用的解决方案是修改路由以使用通配符,称为“Route Globbing”。请参阅此链接:http://guides.rubyonrails.org/routing.html#route-globbing-and-wildcard-segments
因此,在您的情况下,路线变为
`get '/api/shops/*city', to: 'shops#index', constraints: /[0-9A-Za-z\-\.\%\s]+/ `
代替
获取 '/api/shops/:city',到:'shops#index',约束:/[0-9A-Za-z\-\.\%\s]+/
.
注意路由中参数“city”前的通配符。
关于ruby-on-rails - 在 Rails 3 的 URL 段中允许编码斜线的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22094785/