首页 > 解决方案 > Rails 在视图和控制器中使用不同的默认 url 选项?

问题描述

为这个挠头。

最近通过 nginx 为我们的站点打开了一个新的反向代理,以支持一个新域。当您通过 old.server.com 或 new.server.com 访问时,您点击了我们的后端。

如果您通过 old.server.com 访问,所有 url 助手都可以正常工作并生成有效的绝对 URL。但是,如果您通过 new.server.com(新的反向代理主机)点击,那么 url 助手只能在视图中正常工作。控制器中使用的 URL 助手使用主机名加上实际的独角兽端口——这对于我们要发送的 URL 是不正确的。

更令人困惑的是,这只是控制器中的情况。在视图中,这在所有情况下都能正常工作。为了在使用 new.server.com 时在控制器中进行这项工作,我需要覆盖 ApplicationController 中的 default_url_options 方法。

是的,我已正确设置Rails.application.routes.default_url_options[:host]Rails.application.routes.default_url_options[:protocol]配置。

我觉得我可能错过了在反向代理中转发一些必需的标头,但还没有弄清楚。但更重要的是,为什么视图和控制器使用不同的上下文来生成绝对 URL?

更新:

两个主机之间的差异似乎是反向代理为 Host 标头提供的值。“旧”代理正在为它发送公共主机,而“新”代理没有发送任何内容。在没有明确数据的情况下,Rails 似乎使用 Host 标头来构建 URL。为了解决这个问题,我需要正确设置 Host 标头或default_url_options在我的控制器中实现该方法。

所以,我现在有工作代码,但控制器和视图没有使用完全相同的代码/设置来创建 URL,这似乎是一个非常糟糕的想法(TM)。这只是标准导轨,还是我错过了一些配置?

标签: ruby-on-railsruby-on-rails-4

解决方案


推荐阅读