ruby Rails SSL问题:(example.com)与请求不匹配,base_url(example.com)

np8igboo  于 2023-10-17  发布在  Ruby
关注(0)|答案(4)|浏览(154)

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

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

这是我的virtualhosts文件。我想我需要以某种方式强制SSL?

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

<VirtualHost *:443>
   ServerAdmin [email protected]
   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>
csga3l58

csga3l581#

由于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。config.force_ssl = true将不工作的情况下,API的是你发送的URL到客户端.

uyto3xhc

uyto3xhc2#

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

config.force_ssl = true

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

brjng4g3

brjng4g33#

我在使用Cloudflare的Flexible SSL时遇到了类似的问题。我将其更改为Full,并在Heroku服务器上激活SSL。
在这里找到解决方案:http://til.obiefernandez.com/posts/875a2a69af-cloudflare-flexible-ssl-mode-breaks-rails-5-csrf

mcdcgff0

mcdcgff04#

在虚拟主机中使用下面的选项解决了这个问题

<VirtualHost *:443>
      ...
      RequestHeader set X_FORWARDED_PROTO 'https'
      ...
 </VirtualHost>

相关问题