エンジニアたるものhttpは使わないようにしましょう。使う意味がありません。
しかし、世の中にはすでにhttpで運営されてるサイトやAPIがたくさんあります。
そこで今回はすでにhttpだけど、httpsでの運用に切り替えるときに使うhtaccessを書こうと思います。
(検索しても意外と決定版みたいなのないので)
単純な場合
これはapacheが1台の構成の場合のものです。特に上流にバランサ(ELBなど)がない場合を想定しています。
下記のような内容で.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の場合は下記のようになります。
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パターンで事が足りるでしょう。もし細かく制御したいケースやご要望などあれば追記しますので、コメントなどでどうぞ。