Apache
AWS
elb
htaccess
HTTPS

htaccessでHTTPSにリダイレクトする

More than 1 year has passed since last update.

エンジニアたるものhttpは使わないようにしましょう。使う意味がありません。
しかし、世の中にはすでにhttpで運営されてるサイトやAPIがたくさんあります。
そこで今回はすでにhttpだけど、httpsでの運用に切り替えるときに使うhtaccessを書こうと思います。
(検索しても意外と決定版みたいなのないので)

単純な場合

これはapacheが1台の構成の場合のものです。特に上流にバランサ(ELBなど)がない場合を想定しています。
下記のような内容で.htaccessを書きましょう。

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

このなかでRewriteRuleの最後に書いてある[R=301,L]のとこなのですが、Rがリダイレクトを指しており、=301を省略すると302がデフォルトになります。
用途に応じて使い分けると良いでしょう。

  • [R=301,L] 永久的なHTTP→HTTPS
  • [R,L] 一時的なリダイレクト

ロードバランサー(80,443対応)の配下にある場合

これはAWS環境でELBがある場合や、その他のプロプライエタリなロードバランサ(LoadMaster、BigIP、Coyote、A10など)の場合に適用できます。もちろんNginxなどのリバースプロキシを使う場合も有効です。
基本的には上流のバランサーにHTTP/HTTPSに応じてリクエストヘッダーを付与してもらいます。
apacheではその内容に応じたRewriteCondを記述します。

例えばAWS環境のELBの場合は下記のようになります。

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

2行目のRewriteCondはHTTPだった場合に付加されるリクエストヘッダーを想定しています。これは製品によって異なりますが、%{HTTP:X-Forwarded-Proto}はAWSのELBの標準的なリクエストヘッダーです。

まとめ

apacheでやる限りだいたい上記の2パターンで事が足りるでしょう。もし細かく制御したいケースやご要望などあれば追記しますので、コメントなどでどうぞ。