様々な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]