使用Rails config.force_ssl在远程SSL代理后面进行无限重定向

时间:2019-03-07 10:36:16

标签: ruby-on-rails nginx https

我正在组织提供的Ubuntu VM上运行Rails 5.2应用程序。 Nginx(1.14.0)和Passenger(6.0.1)一起提供服务。

SSL由组织通过负载平衡器提供。我的应用程序托管在内部网络的myapp1上,并且该组织提供了一个面向公众的myapp.org.com,该应用程序向最终用户提供SSL,并通过HTTP通过内部网络将流量代理到myapp1。我无法控制myapp.org.com上的负载均衡器。

该应用程序也位于/ project子目录中。当访问https://myapp.org.com/时,如预期的那样(现在),我从Nginx服务器收到403。当我访问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 个答案:

答案 0 :(得分:1)

您组织的负载平衡器必须将 X-Forwarded-Proto 传递给您的nginx实例。您的应用程序无法检测到由ssl终止的负载均衡器正在浏览它。如果它不起作用,则可能需要在应用程序内部将负载均衡器的IP列入白名单。 (我不知道怎么做,我不编码ruby)