どうも、カッパです。
.htaccessを使ったURLの正規化について、前回は一発コピペでOKな感じのおまとめ編を書いたのですが、個別の説明も必要かと思うので、ここで説明します。
また、URL正規化の意義について知りたい方は下記のリンクからどうぞ。
.htaccess で行うURLの正規化 ( wwwあり / なし統一、index.html非表示、https強制) まとめてどうぞ
.htaccessを使ったURLの正規化について。今時必須のhttps強制、wwwあり/なし、indexファイルの非表示化をまとめて設定できるようにしました。初心者が不安に思う点、実際に記述した際に迷いがちなポイントも解説してあります。
wwwあり、なし統一のコード解説
今回はwwwあり、なしの統一について説明します。まずはコードを見てみましょう。kappasta.では「wwwなし」で統一してあるため、wwwなしのコードで解説します。
URLの正規化をwwwなしで統一する場合
RewriteEngine on
# wwwなし
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
# URL正規化コードここまで
以上、1行目から解説します。
RewriteEngine on
これはWebサーバーのリライト機能を有効にする命令です。リライト機能がどんな処理を行うかというと、アクセスされたURLを書き換え(リライト)します。
RewriteCond
後述のRewriteRuleとセットで使います。RewriteRuleで設定した命令を実行するための条件をここで指定しています。この命令を日本語に意訳すると「もし、www.example.comでアクセスがあった場合...」となります。
RewriteRule
RewriteCondの条件にマッチした場合に実行する処理をここに記述します。ここではwwwありのURLを受け取り、それをwwwなし(https://example.com/)に書き換える処理をしています。
その他の命令
%{HTTP_HOST} ^www\.example\.com$
RewriteCond
の具体的な条件が書かれています。これもむりやり和訳すると「xxxがoooなら」と読むことができ、それぞれ
- xxx →
%{HTTP_HOST}
- ooo →
^www\.example\.com$
となっています。
ちなみに「xxx」の%{HTTP_HOST}
は、Webサーバー設定ファイル(.htaccess)の固有の書き方なので、呪文のようなものだという認識でOKです。
難しいのは「ooo」の「^」から始まり「$」で終わる部分、ここは正規表現と呼ばれるプログラミングで使われる文字検索の書式に合わせた書き方になっています。ここではひとまず「.(ドット)の前に\(バックスラッシュ)を付ける」とだけ覚えておけば大丈夫。
^(.*)$
上で出てきた「^」と「$」があるので「これも正規表現?」と思った方、その通りです。Webサーバーがアクセスを受けたURLのうち、%{HTTP_HOST}以下の部分、たとえば「programing/wordpress」などを指すのですが、その文字列を「どんな文字でも何文字でもOK」と定義しているのが「.*」です。
また「.*」部分を「()」で囲むことにより、カッコの中身を変数として使うことができます。後述の$1が「(.*)」の中身となります。
https://example.com/$1
RewriteCond
の条件でアクセスされたURLをこの形に書き換えるという命令です。ここだけを和訳しても分かりにくいので、一連の動作を和訳してみます。
RewriteCond
で定義された条件に合うwwwを含むURL(www.example.com/example/url)でアクセスがありましたRewriteCond
の条件にマッチしたので、RewiteRuleが実行されますRewriteRule
はドメイン以下のURL文字列をすべて変数$1に格納しますRewriteRule
は$1以外の部分を「https://example.com/」に書き換えます
[R=301,L]
最後です。R=301を和訳すると「301という方法でリダイレクト(URL書き換え)して下さい」という意味になります。301という方法は「恒久的な転送」と定義されています。恒久的とか言われると難しいですけど、要は書き換え以前のURL(今回の場合wwwあり)を存在しないものとして扱うということになります。強力な感じがしますね。
そして最後の「L」は、このルールでURLの書き換えが行われた場合、ここでリライト機能(mod_rewrite)を終了するという印(フラグ)になります。
URLの正規化をwwwありで統一する場合
こちらはwwwありの場合。RewriteCondとRewriteRuleにあるwwwの記述が逆になっているのが分かると思います。
RewriteEngine on
# wwwあり
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
# URL正規化コードここまで
URLの正規化を早いうちにやっておくべき理由
URLの正規化は余計なインデックスを避けることができ、SEO的に必須と言われてます。それはその通りだと思います。
さらに、URL正規化のもう一つの目的はアクセス解析の正確性を確保するという意味でも重要だと考えています。長い間wwwありなし両方、indexファイル表示のありなしで計測していては、せっかくの貴重なデータが汚れてしまいます。
そういうことが起きないように、URL正規化の情報をまとめておくのは意味のあることだと思っています。