在apache反向代理后面的子目录中的Rails

时间:2016-04-14 12:50:41

标签: ruby-on-rails apache reverse-proxy

我不明白。我试图在apache反向代理后面运行一个Rails应用程序。我在端口8080上使用Unicorn。

bundle exec unicorn -c config/unicorn.rb -E production -p 8080

Apache VirtualHost

ProxyPass /foo/ http://localhost:8080/
ProxyPassReverse /foo/ http://localhost:8080/

这基本上有效。对http://domain.tld/foo/的请求到达Rails应用程序。以下是使用ApplicationController.before_filter中的以下内容重定向到身份验证机制:

redirect_to controller: 'sessions', action: 'index'

正如所料,我将被重定向到http://domain.tld/sessions/。现在,我想将Rails配置为全局重定向到http://domain.tld/foo/sessions/,而不是每次重定向都明确提及它。

我尝试在config / environments / production.rb中使用它:

config.relative_url_root = '/foo'
config.action_controller.relative_url_root = '/foo'

用这个开始独角兽:

RAILS_RELATIVE_URL_ROOT='/foo' bundle exec unicorn -c config/unicorn.rb -E production -p 8080

不幸的是,这不起作用。它根本不会改变行为。我在重定向之前添加了调试输出,看看是怎么回事。

puts Rails.application.config.relative_url_root
puts ENV['RAILS_RELATIVE_URL_ROOT']
puts url_for controller: 'sessions', action: 'index'

打印出来:

/foo
/foo
http://domain.tld/sessions

有人可以告诉我为什么Rails不考虑配置吗?

1 个答案:

答案 0 :(得分:0)

看起来我已经有了解决方案。我不得不将apache配置更改为此

ProxyPass /foo/ http://localhost:8080/foo/
ProxyPassReverse /foo/ http://localhost:8080/foo/

和config.ru到此

if Rails.env.production?
  map '/foo' do
    run Rails.application
  end
else
  run Rails.application
end