ドメインを正規化する

前回の記録: .htaccessとは Apacheサーバーでは".htaccess"というファイルに設定を記述することでリダイレクト処理などを行えることを説明した. 今回はこのリダイレクト処理を利用してドメインを正規化してみる.

ドメインの正規化

何も設定をしていない場合,次のURLはすべて同じページを表示する.
  • http://example.com
  • https://example.com
  • http://www.example.com
  • http://www.example.com/index.html
  • などなど...

httphttpsか,wwwが有るか無いか,ルートドメインか/index.htmlとファイル名まで指定されているかなど…様々なバリエーションのURLで同じページへアクセス出来る.

しかしこれは問題だ. 例えば,HTTPSが有効なページにも関わらず"http://example.com"などとアクセスされた場合,HTTPSは有効にならない. また,アクセス解析を行っているページの場合,URLが異なるとページビューがそれぞれのURLへ分散してしまう. ユーザーもどれでアクセスすれば良いのか迷ってしまうかもしれない.

そこでドメイン(URL)の正規化を行う. 例えばどのURLでアクセスされても"https://example.com"へリダイレクトするよう設定するのだ. これをドメインの正規化と言う. 正規化は上述の問題の解決策だ. どのURLからでもHTTPSは有効になるし,ページビューも正しく収集できるようになる.

注意事項

レンタルサーバーの場合,.htaccessでの設定が制限されていたり,各社の方針に依り設定方法が異なる場合がある. そのため,下記に紹介する設定が必ずしも動作する保証はない. もし上手く動作しない場合はHTTPのリダイレクトが多すぎますToo many redirectsやその他のエラーが表示されることがある. そのような場合は該当レンタルサーバーに特化した解決策を別途インターネット検索するか,各レンタルサーバー業者さまへお問い合わせいただきたい.

正規化する

.htaccessでApacheサーバーの挙動を変更するにはRewriteEngineonにする必要がある. まずは下の一行を.htaccessの先頭に書いておこう(#で始まる行はコメント文).
# Enabling Rewrite Engine
RewriteEngine on

wwwなしへ

# Redirecting to www to non-www
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [L,NE,R=301]
HTTPSを有効にしたい場合はhttp://https://へ変更しよう.

wwwありへ

# Redirecting to non-www to www
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [L,NE,R=301]
wwwなし同様,HTTPSを有効にしたい場合はhttps://へ変更する.

wwwなしのHTTPSへ

# Redirecting to non-www using HTTPS
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,NE,R=301]

wwwありのHTTPSへ

# Redirecting to www using HTTPS
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.ドメイン名.com%{REQUEST_URI} [L,NE,R=301]

HTTPSへ (さくらサーバーの場合)

# Redirecting to HTTPS connection
RewriteCond %{ENV:HTTPS} !^on$
RewriteCond %{HTTP:X-SAKURA-FORWARDED-FOR} ^$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

index.htmlなどを消す

# Redirecting to the root directory
RewriteRule ^index\.(html|php)$ / [L,R=301]
RewriteRule ^(.*)/index\.(html|php)$ /$1/ [L,R=301]
これで次のようなアクセスもすべて"http://example.com"のようなアドレスへリダイレクトされる.
  • http://example.com/index.html
  • http://example.com/index.php

これまでの設定を踏まえて,ひとつ例を書いてみる.

.htaccessの例

# Enable Rewrite Engine
RewriteEngine on

# Force Redirect to HTTPS
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,NE,R=301]

# Redirect to root URL
RewriteRule ^index\.(html|php)$ / [L,R=301]
RewriteRule ^(.*)/index\.(html|php)$ /$1/ [L,R=301]
この例ではwwwなしのHTTPSへリダイレクトし,かつファイル名(/index.htmlなど)も付かない形へリダイレクトするよう設定している.

さくらサーバーの場合

# Enable Rewrite Engine
RewriteEngine on

# Force Redirect to HTTPS
RewriteCond %{ENV:HTTPS} !^on$
RewriteCond %{HTTP:X-SAKURA-FORWARDED-FOR} ^$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Redirecting www to non-www
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,NE,R=301]

# Redirecting to root URL
RewriteRule ^index\.(php|html?)$ / [R=301,L]
RewriteRule ^(.*)/index\.(php|html?)$ /$1/ [R=301,L]
さくらサーバーで同じことを行う場合は上記の設定を記述する.

オプションの説明

  • RewriteCond: IF文で言う条件式を記述する際に使う
  • RewriteRule: RewriteCondに当てはまる場合に行う処理
  • OR: 条件文としてのOR
  • NC: 大文字小文字の区別をしない
  • NE: 特殊文字をエスケープしない
  • R=301: リダイレクトとして処理する*
  • L: 他の処理を中断して直ちにリダイレクトする
  • %{REQUEST_URI}: ホスト名無しのURI
  • ^いろは: 正規表現,文字列先頭が”いろは”である
  • !いろは: 正規表現,文字列”いろは”で無いこと
*リダイレクトとして処理しないとSEO的によろしくない結果を招く可能性があるので注意
以上,設定ファイル.htaccessを使ったドメインの正規化について. これを行っておくとブラウザのURLバーに表示されるURLに統一感が生まれ,アクセス解析やSEOの観点からでも良い結果を出せるので,Webサイトを公開する際にはぜひともURLの正規化をおすすめしたい.

参考サイト

8669466528884146652 https://www.storange.jp/2018/02/blog-post.html https://www.storange.jp/2018/02/blog-post.html ドメインを正規化する 2018-02-26T11:44:00+09:00 https://www.storange.jp/2018/02/blog-post.html Unknown 200 200 72 72