私のサイトに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>
CloudflareのフレキシブルSSLを使用しているときに、同様の問題が発生しました。フルに変更し、HerokuサーバーでSSLをアクティブにしました。
ここで解決策を見つけました: http://til.obiefernandez.com/posts/875a2a69af-cloudflare-flexible-ssl-mode-breaks-Rails-5-csrf
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の場合は機能しません。