web-dev-qa-db-ja.com

Rails SSLの問題:(https://example.com)がrequest.base_url(http://example.com)と一致しませんでした

私のサイトに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>
11
Matt Hough

CloudflareのフレキシブルSSLを使用しているときに、同様の問題が発生しました。フルに変更し、HerokuサーバーでSSLをアクティブにしました。

ここで解決策を見つけました: http://til.obiefernandez.com/posts/875a2a69af-cloudflare-flexible-ssl-mode-breaks-Rails-5-csrf

6
Zavitoski

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は、クライアント側にURLを送信していたAPIの場合は機能しません。

1
Rahul Chaudhari