【问题标题】:What's the best way of allowing encoded slashes in a URL segment in Rails 3?在 Rails 3 的 URL 段中允许编码斜杠的最佳方法是什么?
【发布时间】:2014-02-28 12:07:22
【问题描述】:

我想要什么

我想传递一个带有编码斜线的 URL 段。


问题

  • 在 Thin 上本地运行,它可以工作
  • 在Passenger/Nginx/Rack 上的服务器上运行,它会中断
  • 之前有东西解码斜线 它到达 Rails

我的问题

  • 允许参数带有斜杠的最佳方式是什么?

我的尝试


细节

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


【解决方案1】:

我们遇到了同样的问题。我们尝试使用 CGI::escape、URI::encode、ERB::Util::url_encode 对字符串进行编码,但在带有乘客和 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]+/ `

而不是 get '/api/shops/:city', to: 'shops#index', constraints: /[0-9A-Za-z\-\.\%\s]+/.

注意参数“city”前的路径中的通配符。

【讨论】:

    猜你喜欢
    • 2018-06-02
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2011-01-24
    相关资源
    最近更新 更多