HTTP/www無しのURLを自動的にHTTPS/www有りのURLに転送する【.htaccess/WordPress】

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です