様々なURLでアクセスされた場合に、それを1つのURLにまとめるURL正規化の話です。
昨今のインターネットでは、SSLに対応していないWebページにアクセスするとブラウザから警告が出るようになっています。なので、Webページを公開する時は必ずSSLに対応するというのは最早常識の域になりつつあります。
しかし、SSLに対応しただけでユーザーがSSLと非SSLのどちらを選ぶかはまた別の話です。URLの先頭がhttps://かhttp://かでSSLと非SSLが振り分けられるようになっていますが、人によってはsを忘れてしまったりする事もあるかもしれませんし、その場合は普通にセキュリティの警告が出ます。
警告が出ないようにそもそもhttp://で公開しないという手もありますが、それだと上のようなケースではWebサイトが存在しない物として扱われてしまいます。
なので、http://を公開しながらアクセスの全てをhttps://にリダイレクトするのが良いと思います。
ついでに、SEO対策としてwwwの有無でページの評価が分散しないように、wwwの有無も統一します。
Webページを公開した最初しかやらなくて毎度忘れているので、自分用のメモとして残しておきます。
.htaccessファイルを作る
Webサイトのドキュメントルートに.htaccessを作成します。Wordpress等だと既に作ってあります。
これの先頭に、以下の内容を記述します。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
これでOKです。http://且つwww無しのURLへのアクセスが、https://且つwww有りのURLに転送されます。
解説
.htaccessに記述した内容を解説します。
URLの書き換えを行うモジュールを利用できる場合に、URL書き換えを有効化して<IfModule mod_rewrite.c>から</IfModule>までの間の処理を実行します。
<IfModule mod_rewrite.c>
RewriteEngine On
...
</IfModule>
http://のURLをhttps://のURLにする
上行が書き換えの条件、下行が書き換えの内容です。
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
SSLのアクセスではない場合に、URLの先頭をhttps://に書き換えます。
%{HTTP_HOST}と%{REQUEST_URI}はアクセスのあったURLに応じて以下のような文字列に置き換えられます。
URL = http://www.example.com/index.html?p=123
%{HTTP_HOST} = www.example.com
%{REQUEST_URI} = /index.html?p=123
https://%{HTTP_HOST}%{REQUEST_URI} -> https://www.example.com/index.html?p=123
末尾の[L,R=301]に関しては詳細を省きますが、リダイレクトが恒久的なリダイレクトであることを表します。
R=300とするとそのリダイレクトは一時的なものであると認識されます。
wwwを付ける
www無しのURLで運用している場合(https://kthksgy.com)や、サブドメインで運用している場合(https://subdomain.kthksgy.com)は以下の2行を省いてください。
上行は『ホスト名の先頭がwww.ではない場合』の条件を表します。
下行はhttps://の時と同じく書き換えを行います。
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]