我正在组织提供的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的远程代理。
答案 0 :(得分:1)
您组织的负载平衡器必须将 X-Forwarded-Proto 传递给您的nginx实例。您的应用程序无法检测到由ssl终止的负载均衡器正在浏览它。如果它不起作用,则可能需要在应用程序内部将负载均衡器的IP列入白名单。 (我不知道怎么做,我不编码ruby)