Бесконечные перенаправления с Rails config.force_ssl за удаленным прокси SSL - PullRequest
0 голосов
/ 07 марта 2019

Я запускаю приложение Rails 5.2 на виртуальной машине Ubuntu, предоставленной моей организацией. Обслуживается Nginx (1.14.0) и Passenger (6.0.1).

SSL предоставляется организацией через балансировщик нагрузки. Мое приложение размещено на myapp1 во внутренней сети, и организация предоставляет общедоступный myapp.org.com, который предоставляет SSL конечному пользователю и передает трафик через HTTP по внутренней сети на myapp1. У меня нет контроля над балансировщиком нагрузки на myapp.org.com.

Приложение также обслуживается в подкаталоге / project. Когда я получаю доступ к https://myapp.org.com/,, я получаю 403 с моего сервера Nginx, как и ожидалось (на данный момент). Когда я получаю доступ к https://myapp.org.com/projects,, я получаю бесконечный цикл перенаправления 301 (перенаправление на тот же URL-адрес ...).

Мой конфиг Nginx выглядит так:

server {
    listen 80;
    server_name myapp myapp.org.com myapp.organisation.com;
    add_header X-Forwarded-Proto https;

    root /var/www;

    location ~ ^/project(/.*|$) {
        # Tell Nginx and Passenger where your app's 'public' directory is
        alias /var/www/project-production/current/public/$1;

        # Turn on Passenger
        passenger_ruby /usr/share/rvm/gems/ruby-2.5.3@project-production/wrappers/ruby;
        passenger_base_uri /project;
        passenger_app_root /var/www/project-production/current;
        passenger_document_root /var/www/project-production/current/public;
        rails_env production;
        passenger_enabled on;
    }
}

А config/environments/production.rb содержит config.force_ssl = true.

Пытаясь решить эту проблему, я также пытался использовать proxy_set_header X-Forwarded-Proto https;, а не заголовок X-Forwarded-Proto.

Если я установлю config.force_ssl = false, он перенаправляется на http, и SSO организации отказывается обслуживать приложение.

Все связанные посты, которые я могу найти в SO и в Интернете, говорят об использовании Nginx в качестве прокси-сервера для локального сервера Rails (например, Unicorn или Passenger standalone), но эта проблема, очевидно, отличается тем, что Nginx обслуживает http запросы к удаленному прокси с поддержкой SSL.

1 Ответ

1 голос
/ 07 марта 2019

Балансировщик нагрузки вашей организации должен передать X-Forwarded-Proto вашему экземпляру nginx. Ваше приложение не может обнаружить, что оно просматривается балансировщиком нагрузки с ssl-терминацией. Если это не сработает, вам может понадобиться добавить ip в балансировщик нагрузки внутри вашего приложения. (я не знаю как, я не пишу код ruby)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...