【问题标题】:Infinite redirects with Rails config.force_ssl behind a remote SSL proxy在远程 SSL 代理后面使用 Rails config.force_ssl 进行无限重定向
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 啊。我们在另一个由 Apache 在不同部门提供的应用程序上使用了 X-Forwarded-Proto,但这可能是侥幸。这也是 Rails 的不同版本。 “白名单负载均衡器的 ip”是什么意思?
  • Apache的情况可能是proxy_pass,需要加上相关的header。所以那是不同的故事。一些框架不信任每个请求“嘿,我来自一个 ssl 终止的负载均衡器,这是相关的标头”。相反,您应该告诉哪个源(负载均衡器)应用程序应该信任。
  • 鉴于您所说的远程代理需要添加 X-Forwarded-Proto 标头,我向网络团队询问了此事。事实证明,他们默认不使用该标头,但已添加该标头,并且该地址现在可以按预期工作!谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-01-06
  • 2016-12-18
  • 2015-07-09
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
相关资源
最近更新 更多