Table of Contents
Webサイトを運営していく中で、以下のような2つのアドレスが全く同じページを指す現象に遭遇すると思います。
- http://sample.com/
- http://sample.com/index.html
このように、同じページであるにも関わらず、複数のURLによってアクセスできてしまうことは、検索エンジンによるクロール・インデックスに悪影響を与えると考えられています。
index.html のないシンプルなURLに統一したいときにどうすれば良いかを以下で解説します。
mod_rewriteを使用
Webサーバー(apache)で使用できる mod_rewrite と呼ばれるモジュールを利用すると、リクエストされたURLとは異なるアドレスに転送(リダイレクト)させることができます。
mod_rewrite は .htaccess という名前のファイルに記載してサーバー上にアップロードして使います。
今回は、ルートディレクトリに置くと、ルートおよびサブディレクトリのURLから index.html と index.php を省略したシンプルなURLに変更してくれる mod_rewrite の書き方を紹介します。
mod_rewriteを書いた.htaccessのサンプル
以下は実際に index.html と index.php を無くしたURLにリダイレクトを行うための .htaccess の中身です。
(行頭が # の行は、実行結果に影響を与えない説明書きです)
# URL から index.html と index.php を無くす mod_rewriteモジュール RewriteEngine on # アクセスしたファイル名が index.html または index.php かどうかをチェック RewriteCond %{REQUEST_FILENAME} index\.(html|php) # ルートディレクトリ用 RewriteRule ^index\.(html|php)$ / [R=301,L] # サブディレクトリ用 RewriteRule ^(.*)/index\.(html|php)$ /$1/ [R=301,L]
これをそのままコピーして .htaccess というファイル名で保存し、サーバーのルートディレクトリにアップロードしてください。
mod_rewriteの説明
以下では、具体的にどのようにリダイレクト処理を行っているかについて紹介します。
mod_rewrite の書式には正規表現が用いられていますが、正規表現に関しての説明は、この記事では割愛します。
RewriteEngine on
mod_rewrite を使う場合に一番最初に書かれるものです。
この行から下で mod_rewrite が有効となります。処理を書くより前にこの行を書き込んで下さい。
RewriteCond
RewriteCond では、リダイレクトを行うリクエストの条件を指定します。
以下のように半角スペースで区切って「どのようなリクエスト」が「どの条件」を満たしたときに、後述する RewriteRule によるリダイレクトを行うかを記述します。
RewriteCond 対象のリクエスト 条件
以下のように書くと「リクエストしたファイルの名前」が「index.html または index.php」であればリダイレクトを行うという意味になります。
RewriteCond %{REQUEST_FILENAME} index\.(html|php)
RewriteRule
RewriteCond での条件を満たした場合に行うリダイレクト処理の内容を RewriteRule の後に記載します。
書式は以下の通りです。
RewriteRule リダイレクトするパス リダイレクト後のパス [フラグ]
例えば、http://sample.com/index.html というようなルートディレクトリ直下の index.html から http://sample.com/ にリダイレクトするには以下のように書きます。
# ルートディレクトリ用 RewriteRule ^index\.html$ / [R=301,L]
また、http://sample.com/abc/index.html のような、サブディレクトリ以下のものを http://sample.com/abc/ というように省略するには以下のように書きます。
# サブディレクトリ用 RewriteRule ^(.*)/index\.html$ /$1/ [R=301,L]
これによって、サブディレクトリ内に個別に .htaccess を設置せずに済みます。
フラグの R が実際にリダイレクトを行うためのフラグで、これがなければリダイレクトが行われません。
RにはHTTPステータスコードを設定することができます。R=301 は、恒久的なリダイレクトであることを意味します。デフォルトでは一時的な移動であることを意味するステータスコードの 302 となります。
フラグの L は、このリダイレクトが行われた場合、これ以降の処理は行わないという意味です。上記のサンプルでは、このフラグはあってもなくても動作に違いはありません。
おしまい
リダイレクトの処理を間違って書いてしまうと、サイトそのものにアクセスできなくなったり意図しないリダイレクトが発生したりといった不具合が起きますので、本番環境ではないところでテストしてから導入すると良いでしょう。
他にも複雑なリダイレクト処理ができますので、機会があれば紹介したいと思います。
より詳しい mod_rewrite の書式については以下のドキュメントをご覧ください。