こんにちは、ryohei(@ityryohei)です!

本記事では、AWSのELBにおけるhtaccessを使用したhttp→httpsのリダイレクト設定についてご紹介しています。

AWSのELBでアクセスを振り分けてるんだけど、ロードバランサー経由のアクセスをhttpからhttpsにリダイレクトするにはどうすればいいの?

上記の疑問にお答えします。

では、解説していきます。

Apacheの基本的なhttp→httpsへのリダイレクト設定

Apacheでは基本的に下記の方法で全ページのリダイレクトが可能です。仕事で愛用しているグローバルサインのサポートサイトにも記載があるので間違いありません!

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

参考サイト:https://jp.globalsign.com/support/allssl/552.html

ただ、タイトルからお察しの通り、この方法ではうまくリダイレクトしません。普段使っているサーバーとの違いは、サーバーへのアクセスにロードバランサーを経由しているくらいなので、それが原因なのかな~と漠然と考えていました。

なので、AWSのサポートにアクセスして調べることに。

AWSのナレッジセンターに答えが!

見つけたアンサーがこちら。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/redirect-http-https-elb/

要するにELB経由でアクセスした場合は直接http→httpsのリダイレクトはできない(リダイレクトループになる)ので、X-Forwarded-Proto ヘッダーでHTTPクライアントだけをリダイレクトするように書き換えルールを設定する必要があるとのことです。なるほど…!

参考ページに X-Forwarded-Proto ヘッダーを追加した設定のサンプルが記載されていたので、さっそく試してみます。

http→httpsにリダイレクトする

ナレッジセンターで得た貴重な情報を頼りに主に使用されるリダイレクト設定を試してみます。

とりあえず全ページをhttpsにリダイレクト

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

wwwなしに統一してhttpsにリダイレクト

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

wwwありに統一してhttpsにリダイレクト

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

それぞれ上記の方法で無事にリダイレクトを設定することができました。めでたしめでたし!

最後に

AWSに関する情報はナレッジセンターに掲載されていることが多くあるので、いつも参考にさせてもらっています。もし欲しい情報がナレッジセンターに存在しなくてもインターネット上に情報を公開してくれているエンジニアの方がたくさんいるので、参考にしてみてくださいね!

以上、AWSのELBにおけるhtaccessのhttp→httpsのリダイレクト設定についてのご紹介でした!