Rails SSL问题:(https://example.com)与request.base_url(http://example.com)不匹配

时间:2017-12-02 13:21:24

标签: ruby-on-rails ruby ssl

我刚刚在我的网站上安装了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>

4 个答案:

答案 0 :(得分:15)

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

config.force_ssl = true

虽然与此问题没有严格关联,但在设置此设置后,您需要确保将反向代理(如果有的话)设置为通过发送X-Forwarded-Proto标头来转发用于rails的协议rails的代理。这样做的方式取决于您使用的反向代理(Apache,nginx等)以及如何配置它,因此最好查找您正在使用的反向代理的特定文档。

答案 1 :(得分:5)

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

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

答案 2 :(得分:0)

由于Rails应用程序服务器在启用SSL的Web服务器后面运行。但是应用程序服务器不知道它,而是继续使用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 :(得分:-2)

就我而言,我将application_controller.rb文件class ApplicationController < ActionController::Base 中的以下行更改为class ApplicationController < ActionController::API