【发布时间】:2014-02-28 12:07:22
【问题描述】:
我想要什么
我想传递一个带有编码斜线的 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
【问题讨论】:
-
在我拥有的一个旧的 3.x rails 应用程序中,我在我的路线中使用了以下内容来允许说 '123-london/dover' 的 'id':
:constraints => {:id => /\d+-[^\/]*/} -
他们应该将文件保存在 AWS 而不是文件系统中 为文件提供了安全 url,这些文件只会在一段时间内处于活动状态,之后令牌将到期 我们已经在我们的一个应用程序中实现了它Ready5(提及链接getready5.com)
标签: ruby-on-rails nginx passenger url-encoding