Proxied Rails app relative_url_root不为url助手添加前缀

时间:2018-03-14 11:13:47

标签: ruby-on-rails reverse-proxy

所以我让Nginx使用以下配置代理rails应用程序

location ^~ /admin {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_pass http://admin/;
}

会影响将所有请求重新写入http://localhost/admin/XXX/YYY/ZZZ => http://admin/XXX/YYY/ZZZ

所以接下来我遇到了资源网址没有指向代理应用的问题,所以config.relative_url_root = '/admin'做了伎俩

下一个问题是link_to生成的每个链接都返回基于/而不是/admin的链接,我相信config.relative_url_root会改变...现在我有点正确,如果我转到rails console然后include Rails.application.routes.url_helpers然后拨打说root_pathmanagement_path,我会收到/admin/admin/management。完美!

现在这是我感到困惑的地方。我视图中生成的所有路由都忽略config.relative_url_root设置的前缀... 为什么此配置选项在控制台环境中工作,但在视图环境中不工作?

config.relative_url_root位于我的application.rb

Rails 5.1.5

1 个答案:

答案 0 :(得分:0)

这个决议并不是我所希望的,但与此同时它也有效。

/config.ru

map ENV['RAILS_RELATIVE_URL_ROOT'] || "/" do
  run Rails.application
end

/nginx.conf

location ^~ /admin {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_pass http://HC_admin/admin;
}

所有改变的是,应用程序本身现在认为它正在/admin或您设置RAILS_RELATIVE_URL_ROOT的任何内容。在我看来,这会破坏你的应用程序部分分离的目的,因为你仍然需要配置它的安装位置。

在要点here

中找到了一些说明