2016-04-14 2 views
1

Я не понимаю. Я попытался запустить приложение Rails за обратным прокси-сервером apache. Я использую Единорог на порт 8080.Rails в подкаталоге за обратным прокси Apache

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/ глобально, без явного упоминания его при каждом перенаправлении.

Я попытался использовать это в конфиге/сред/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 не принимает конфигурацию во внимание?

ответ

0

Похоже, у меня есть решение. Я должен был изменить апачские конфигурации для этого

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 
Смежные вопросы