前回の記録: .htaccessとは
Apacheサーバーでは".htaccess"というファイルに設定を記述することでリダイレクト処理などを行えることを説明した. 今回はこのリダイレクト処理を利用してドメインを正規化してみる.
ドメインの正規化
何も設定をしていない場合,次のURLはすべて同じページを表示する.
- http://example.com
- https://example.com
- http://www.example.com
- http://www.example.com/index.html
- などなど...
httpかhttpsか,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サーバーの挙動を変更するにはRewriteEngineをonにする必要がある. まずは下の一行を.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
- ^いろは: 正規表現,文字列先頭が”いろは”である
- !いろは: 正規表現,文字列”いろは”で無いこと
以上,設定ファイル.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
Hideyuki Tabata
Hideyuki Tabata
200
200
72
72