【问题标题】:Rails SSL issue: (https://example.com) didn't match request.base_url (http://example.com)Rails SSL 问题:(https://example.com) 与 request.base_url (http://example.com) 不匹配
【发布时间】:2020-03-16 05:13:37
【问题描述】:

我刚刚在我的网站上安装了 SSL 证书。不幸的是,它破坏了登录功能。在网站上提交登录表单后,它只是重定向到主页。检查 rails 日志显示此错误:

(https://example.com) didn't match request.base_url (http://example.com)

这是我的虚拟主机文件。我想我需要以某种方式强制 SSL?

<VirtualHost *:80>
   ServerName example.com
   ServerAlias www.example.com
   Redirect permanent / https://example.com/
</VirtualHost>

<VirtualHost *:443>
   ServerAdmin hello@example.com
   ServerName example.com
   ServerAlias www.example.com
   SSLEngine on
   SSLCertificateFile /home/user/sharetribe/lib/certificates/www_example_com.crt
   SSLCertificateKeyFile /home/user/sharetribe/lib/certificates/example.com.key
   SSLCertificateChainFile /home/user/sharetribe/lib/certificates/www_example_com.ca-bundle

   ProxyRequests Off
   <Proxy *>
      Order deny,allow
      Allow from all
   </Proxy>
   ProxyPass / http://localhost:3000/
   ProxyPassReverse / http://localhost:3000/
</VirtualHost>

【问题讨论】:

    标签: ruby-on-rails ruby ssl


    【解决方案1】:

    只是遇到同样的错误。在config/environments/production.rb 中确保您已设置:

    config.force_ssl = true
    

    虽然与此问题不严格相关,但在设置此设置后,您需要确保您的反向代理(如果有的话)设置为通过从代理发送 X-Forwarded-Proto 标头将使用的协议转发到 rails到铁轨。执行此操作的方式取决于您使用的反向代理(Apache、nginx 等)以及您如何配置它,因此您最好查看正在使用的反向代理的特定文档。

    【讨论】:

    • 谢谢,我明天可以去看看。
    • 抱歉延迟回复。这给了我太多重定向错误。
    • 是的,这是您的网关配置错误。您的网关(nginx、apache)没有让 rails 知道正在使用哪个协议,因此 rails 认为您正在使用 http 并尝试将您重定向到您已经在的位置。 stackoverflow.com/questions/16223470/…
    • 我很少使用 apache,但您需要将 proxy_set_header X-Forwarded-Proto 设置为 https,让 rails 知道您已经在使用 https。
    • 我遇到了同样的问题。升级到 SSL 后,我忘记将 X-Forwarded-Proto 更改为 https。我之前没有注意到,因为 Firefox 工作正常,但 Chrome 抱怨。
    【解决方案2】:

    由于 Rails 应用程序服务器在启用 SSL 的网络服务器后面运行。但是应用服务器不知道它并继续使用 HTTP 协议。由于request.base_url 给出了HTTP URL。

    要让应用服务器知道 SSL 已启用并使用 https 协议,您需要明确告诉应用服务器。

    在Nginx的web服务器上,我用过,

    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Forwarded-Ssl on;
    

    对于 Apache Web 服务器,需要找到类似的设置。

    我认为使用config.force_ssl = true 可以解决问题,但由于此配置不正确,将所有 HTTP 请求更改为 HTTPS。意味着如果有人使用 HTTP 请求,它将重定向到 HTTPS。如果您将 URL 发送到客户端,config.force_ssl = true 将在 API 的情况下不起作用。

    【讨论】:

      【解决方案3】:

      我在使用 Cloudflare 的灵活 SSL 时遇到了类似的问题。我将其更改为完整,并在我的 Heroku 服务器上激活了 SSL。

      在这里找到解决方案:http://til.obiefernandez.com/posts/875a2a69af-cloudflare-flexible-ssl-mode-breaks-rails-5-csrf

      【讨论】:

      • @Zavitoski 非常感谢!我可以确认问题(使用 Cloudflare)和解决方案(灵活 => 完整)SSL 设置。它就像一个魅力!
      猜你喜欢
      • 2019-04-23
      • 2016-01-16
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 2022-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多