.htaccessファイルでHTTPアクセスをSSLにリダイレクトする方法とその逆も

  • 公開日:2013/6/10
この記事は最終更新日から5年以上が経過しています。

.htaccessを使って、HTTPアクセスされたページをSSLでリダイレクトする方法と、その逆のSSLでアクセスされたページをHTTPでリダイレクトする方法です。


.htaccessとは、ApacheなどのWebサーバーで使用できる、Webサーバーの動作をディレクトリ単位で制御するためのファイルです。
SSLを使いたいディレクトリに以下を記述した.htaccessファイルを配置します。

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

ファイルを個別に指定したい場合の記述は以下のようになります。
例)a.htmlとb.htmlだけをSSL対応したい

<br>
RewriteEngine on</p>
<p>RewriteCond %{REQUEST_URI} .*/a.html$ [OR]<br>
RewriteCond %{REQUEST_URI} .*/b.html$<br>
RewriteCond %{HTTPS} off<br>
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]</p>
<p>RewriteCond %{REQUEST_URI} !(.*/a.html$)<br>
RewriteCond %{REQUEST_URI} !(.*/b.html$)<br>
RewriteCond %{HTTPS} on<br>
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R,L]<br>

逆にSSLでアクセスされたページをHTTPでリダイレクトする場合は、

<br>
RewriteEngine on<br>
RewriteCond %{HTTPS} on<br>
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R,L]<br>

すなわち、
「HTTPS」がoffの場合 → HTTPでのアクセスなのでSSL(HTTPS)でリダイレクト
「HTTPS」がonの場合 → SSL(HTTPS)でのアクセスなのでHTTPでリダイレクト
というわけです。

ちなみに[R,L]の意味ですが、
[L]は、定義の最終行(Last)を意味します。
この行以降のRewriteRuleは無視されます。一番最後の行に書きます。
[L]を書かなくても動作します。
[R]は、リダイレクトを行います。

最後に.htaccessファイルの配置についてですが、実際の運用では、至る所に.htaccessが散らばると管理がやりにくくなるので、ドキュメントルート直下にSSL→HTTPを記述した.htaccessを配置し、SSLを使いたいディレクトリにだけHTTP→SSLを記述した.htaccessを配置するのが良いと思います。

2019.10.7 追記
SSL強制以外にもよく使う記述をまとめました。
.htaccessでURL正規化(wwwあり・なし、https強制、index.html(php)なし)