Techioz Blog

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