Подтвердить что ты не робот

Https перенаправление для приложения rails за прокси?

объявление сервера в моем nginx.conf:

    listen       1.2.3.4:443 ssl;
    root /var/www/myapp/current/public;
    ssl on;
    ssl_certificate /etc/nginx-cert/server.crt;
    ssl_certificate_key /etc/nginx-cert/server.key;
    location / {
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_redirect off;

          if (!-f $request_filename) {
            proxy_pass http://upstreamy;
            break;
          }
     }

декларация upstream в nginx.conf:

upstream upstreamy {
    server unix:/var/www//myapp/shared/sockets/unicorn.sock fail_timeout=0;
}

это отлично работает, myapp доступен как https://somehost

но приложение генерирует http-url для перенаправления, поэтому, например, при аутентификации с помощью dev/to перенаправляется на http://somehost/user/sign_in вместо https (с точки зрения приложения rails, все это все равно).

Я пробовал

proxy_pass https://upstreamy;

но он просто пытается зашифровать трафик между nginx и единорогами, которые запускают приложение rails.

Я также пробовал в application_helper.rb:

# http://stackoverflow.com/info/1662262/rails-redirect-with-https
def url_options
  super
  @_url_options.dup.tap do |options|
  options[:protocol] = Rails.env.production? ? "https://" : "http://"
  options.freeze
end

но, похоже, он не работает.

Как это решить?

Изменить: поэтому цель заключается не в том, чтобы приложение rails требовало ssl, либо для принудительного использования ssl; цель состоит в том, чтобы заставить rails app генерировать https://urls при перенаправлении... (я думаю, что все другие URL-адреса являются относительными).

4b9b3361

Ответ 1

Вам нужно добавить следующую строку:

proxy_set_header X-Forwarded-Proto https;

как в

location / {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-Proto https;
      proxy_redirect off;

      if (!-f $request_filename) {
        proxy_pass http://upstreamy;
        break;
      }
 }

Ответ 2

Вы можете передать :protocol => "https", redirect_to.

Вы можете установить это значение по умолчанию, добавив следующее к application.rb

Rails.application.routes.default_url_options[:protocol]= 'https'

Ссылка: fooobar.com/info/288012/...