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;
          }
     }

nginx.conf 中的上游声明:

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

这工作正常,MyApp 可作为 https://somehost 访问

但是该应用程序正在为重定向生成HTTP URL,因此例如,在使用Devise进行身份验证时,/被重定向到 http://somehost/user/sign_in 而不是HTTPS(从Rails应用程序的角度来看,无论如何都是HTTP)。

我试过了

proxy_pass https://upstreamy;

但这只是试图加密NGINX和运行Rails应用程序的独角兽之间的流量。

我也尝试过,在 application_helper.rb 中:

# http://stackoverflow.com/questions/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应用程序在重定向时生成 https://URL。(我认为所有其他网址都是相对的)。

您需要添加以下行:

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;
      }
 }
<</div> div class="one_answers">

你可以传递:protocol => "https" ,redirect_to。

您可以通过将以下内容添加到 application.rb 来将其设置为默认值

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

参考: https://stackoverflow.com/a/6101147/446203

相关内容

  • 没有找到相关文章

最新更新