ruby-on-rails - 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)。这只是标准导轨,还是我错过了一些配置?
解决方案
推荐阅读
- mysql - 如果有人在我调用最后一个插入 ID 之前将新数据插入数据库怎么办?
- python - 树莓派上的 Crontab 没有运行
- android - 对图书馆应用程序的匕首刀柄支持
- visual-studio-code - gem5中,如何知道类的具体位置?
- dns - DNS 权威名称服务器示例
- c++ - 打印向量数组 c++
- objective-c - 如何在clang CFLAGS(字符串文字)中#define和使用表达式
- c++ - 删除双向链表中节点的删除函数 (C++)
- javascript - CRM 365 - 在验证需要执行 FetchXMLQueries 时阻止“onSave”操作
- google-colaboratory - 如何在 colab hostruntime 中直接运行 x11-apps(xeyes, glxgears)?