ruby-on-rails - 在 Rails 3 的 URL 段中允许编码斜线的最佳方式是什么?

标签 ruby-on-rails nginx passenger url-encoding

我想要什么

我想传递带有编码斜杠的 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

最佳答案

我们遇到了同样的问题。我们尝试使用 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/

相关文章:

nginx - Kubernetes ingress-nginx - 如果未配置 TLS,如何禁用 https 监听?

docker - Windows 主机上 Linux 容器的卷

ruby-on-rails - Passenger 仅适用于将要开发的 RailsEnv

ruby-on-rails - 为 nil :NilClass Ruby on Rails Guide 获取未定义的方法 `errors'

ruby-on-rails - 延迟作业的 Controller 操作

url - Nginx是否在路径中支持原始unicode?

ruby-on-rails - Rails 3.1 应用部署教程

ruby - 我如何绝对确保 Phusion Passenger 实例保持事件状态?

javascript - 如何在 Rails 中安装 jschr 的 bootstrap-modal

jquery - Rails 3 respond_to 不响应