【发布时间】:2019-03-07 18:55:17
【问题描述】:
我在我的组织提供的 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 的远程代理的请求。
【问题讨论】:
-
您的问题表明您正在本地运行应用程序,但您声明您正在编辑 config/environments/production.rb。你确定是在编辑正确的环境文件吗?
-
我不知道我在本地运行它的建议,但它绝对是正确的环境文件!
-
如果您在本地运行应用程序,您对 config/environments/production.rb 所做的任何更改都将被忽略。您应该编辑 config/environments/development.rb,除非您已明确将应用程序设置为在 VM 上以生产模式运行,这不太可能
-
哦,我明白了。不,该应用程序未在本地运行。 VM 更像是 VPS - 只是组织使用的术语 :)
-
嗯,有道理
标签: ruby-on-rails nginx https