【.htaccess】レンタルサーバーでHTTPSリダイレクトループに苦しめられたときの解決法
はじめに
この記事は、私が実際に直面した問題をきっかけに執筆しました。私は、Webアプリケーションをレンタルサーバーにアップロードし、HTTPアクセスが正常に動作することを確認した後、SSL証明書を有効化しました。しかし、その後HTTPSリダイレクトを .htaccess
で設定した際、リダイレクトループが発生し、想定通りに動作しない問題に直面しました。この記事では、その原因と解決方法について、同様の環境で困っている方に向けて解説します。
.htaccess
とは
ApacheというWebサーバーで使える設定ファイルです。特定のディレクトリに置くだけで、そのフォルダ以下のアクセス制御やURLの書き換えなどを行うことができます。
レンタルサーバーでは、サーバー全体の設定に触れられない代わりに、この .htaccess
を使ってカスタマイズするのが一般的です。
よくあるリダイレクト設定とその落とし穴
Apacheで .htaccess
を使ってHTTPSリダイレクトを設定するのは一般的ですが、HTTPSを強制したいとき、よく以下のような設定が紹介されています。私は、以下の設定が効かずにリダイレクトループにハマっていました。
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
この設定は「HTTPSではないときに、HTTPSにリダイレクトする」という意味です。
ところが、この設定が効かない場合があります。
特に、CDN(クラウド経由の配信サービス)やリバースプロキシ(中継サーバー)を使っている環境では、Apacheが「HTTPでアクセスされたと勘違いしてしまい、HTTPS
が常に off
のままとなるため、この方法ではリダイレクトがうまく動作しません。
HTTPS off
では正しく動作しないのか?
なぜ Apacheの %{HTTPS}
は、サーバーがSSL/TLSを直接終端している場合のみ on
になります。つまり、以下のような構成では常に off
のままです:
[Client] ⇄ [CDN/Proxy (HTTPS)] ⇄ [Apache (HTTP)]
リバースプロキシとは、クライアントとWebサーバーの間に配置される中継サーバーであり、SSL/TLS通信を終端する役割を担う場合もあります。そのため、Apacheは「HTTPでアクセスされている」と誤認してしまうのです。
X-Forwarded-Proto
ヘッダーを使う
解決策:このような環境では、リバースプロキシが送信する X-Forwarded-Proto
ヘッダーを使って、元の通信がHTTPかHTTPSかを判定するのが正しい方法です。
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
これは Apache に対し、「クライアントとの通信がHTTPだった場合にだけ、以下のルールを適用する」という意味になります。これにより、リバースプロキシ下でも正しくHTTPSへ誘導できます。
運用上の注意点
- CDNやロードバランサを使っている場合は、
X-Forwarded-Proto
ヘッダーを確実に転送する設定になっているかを確認してください。一部のレンタルサーバーやCDNサービスでは、このヘッダーが自動で付かないことがあります。 - セキュリティ強化のためにも、リダイレクト後はHTTPアクセスを遮断する設定(Apache側のVirtualHostでの制限)を設けると安心です。
まとめ
.htaccess
によるHTTPSリダイレクトが効かない場合、環境がリバースプロキシを利用していないかを確認し、X-Forwarded-Proto
をチェックしましょう。適切なリダイレクト条件を使うことで、想定通りのHTTPS強制を実現できます。
おわりに
レンタルサーバーにアプリを公開して、「HTTPSにリダイレクトしたらループしてしまう…」という方は、今回紹介した X-Forwarded-Proto
を使った設定をぜひ試してみてください。
実際に私もこの問題には数時間悩みましたが、この方法を試したことで、リダイレクトループから無事に抜け出すことができました。本記事が、同じ問題に直面した方の助けになれば幸いです。
参考リンク
- Stack Overflow: Why does RewriteCond %{HTTPS} off not work behind a proxy?
- Qiita: ApacheでHTTPSにリダイレクトする方法
- Apache公式ドキュメント - mod_rewrite RewriteCond
株式会社ONE WEDGE
【Serverlessで世の中をもっと楽しく】
ONE WEDGEはServerlessシステム開発を中核技術としてWeb系システム開発、AWS/GCPを利用した業務システム・サービス開発、PWAを用いたモバイル開発、Alexaスキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
Discussion