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>
解決策
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 の場合には機能しません。