".htaccess" に記述することにより、外部から要求されたリクエスト URL を書き換えてリダイレクトします。
ファイルの移転、ディレクトリ再編成、サイト移転、更にはアクセス拒否まで絶大な効果を発揮します。
具体的には、外部から要求されたリクエスト URL を Apache の "mod_rewrite" 拡張モジュール(URL書き換えエンジン)を使用し、 正規表現を使って書き換えます。
"Redirect" と異なり、リクエストの URL が実在しなくても転送が可能です。
*注 サーバーの環境:
Apache1.2 以降で使用可能。
Apache の "httpd.conf" で、 "mod_rewrite" モジュールが利用可能になっている必要があります。
Apache httpd.conf の詳細設定 LoadModule
一般的な書式
RewriteEngine on
RewriteBase /
#ドメインの統一
RewriteCond %{HTTP_HOST} ^(example\.com)(:80)? [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
#ディレクトリの移転
RewriteRule ^old_dir(.*)$ /new_dir$1 [R=301,L]
#ファイルの移転
RewriteRule ^old_dir/index\.html$ /new_dir/index.html [R=301,L]
#クローラのアクセス禁止
RewriteCond %{HTTP_USER_AGENT} Badbot-1 [NC, OR]
RewriteCond %{HTTP_USER_AGENT} Badbot-2 [NC]
RewriteRule !^robots\.txt$ - [F]
RewriteEngine off
*注
書き換え対象に正規表現の特殊文字が含まれている場合は、 "\" (日本語環境では円マーク) でエスケープします。
*注
書き換え対象 "old_dir" が、 "/" から始まっていないことに注意してください。
*注
書き換え後 "/new_dir" が、 "/" から始まっていることに注意してください。
ファイルの移転
リクエストに対して、ファイルが移転したことを知らせます。
RewriteRule ^old_dir/index\.html$ /new_dir/index.html [R=301,L]
【解説】(行頭から)old_dir/index.html(行末まで)のアクセスを "/new_dir/index.html" にリダイレクトし、ここではファイルが永久に移転したことを通知しています。
書き換えが行われたら終了。
ディレクトリの移転
リクエストに対して、ディレクトリ全体が移転したことを知らせます。
"http://~" から記述することにより、外部ドメインへのリダイレクトも可能です。
# 内部移転
RewriteRule ^old_dir(.*)$ /new_dir$1 [R=301,L]
# 外部移転
RewriteRule ^old_dir(.*)$ http://www.example/new_dir$1 [R=301,L]
【解説】".*" =任意の1文字0回以上の繰り返し。
(.*) の値が、後方参照 $1 に入ります。
拡張子の変更
リクエストに対して、ファイルの拡張子を書き換えてリダイレクトします。
# 拡張子が ".html" のファイルを、全て ".phtml" に変更する
RewriteRule ^(.*)\.html$ /$1.phtml [R=301,L]
# 特定のディレクトリに対して、ファイルの拡張子を変更する
RewriteCond %{REQUEST_URI} ^/example/ [NC]
RewriteRule ^(.*)\.html$ /$1.phtml [R=301,L]
# 特定のディレクトリを除いて、ファイルの拡張子を変更する
RewriteCond %{REQUEST_URI} !^/example/ [NC]
RewriteRule ^(.*)\.html$ /$1.phtml [R=301,L]
【解説】特定のディレクトリに関しては、(行頭から)"/example/" の大小を問わない文字を含む(もしくは含まない)アクセスに対して、拡張子 ".html" を ".phtml" に書き換えてリダイレクトしています。
ここではファイルが永久に移転したことを通知しています。
書き換えが行われたら終了。
サーバ移転(サイトの引越し)
リクエスト全体を、新しいドメインへリダイレクトします。
RewriteRule ^(.*)$ http://www.new-example.com/$1 [R=301,L]
【解説】HTTPステータスコード "R=301(Moved Permanently)" を付加することにより、URLが永久に移動したことを検索サイトのクローラに通知します。
この処理で、旧サイトのページランクを自動的にほぼ引き継ぐことができます。
検索サイトへの反映は、クローラにもよりますが、1週間から1ヶ月ほどかかります。
ドメインの統一
サーバーは1つのドメイン、例えば "example.com" に対して、"www.example.com" でもリクエストを受け付けます。
host がサブドメインを使用している場合は、更に "example.host.com" と "www.example.host.com" でも閲覧可能になり、合計4つのサイトにアクセスが分散することになります。
これは、 SEO 対策上あまり好ましいことではありません。 ここでは、"Rewrite" を使って、"www.example.com" に統一する場合を記述します。
◇サブドメインを使用していない場合
RewriteCond %{HTTP_HOST} ^(example\.com)(:80)? [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
◇サブドメインを使用している場合
RewriteCond %{HTTP_HOST} ^(example\.com)(:80)? [NC,OR]
RewriteCond %{HTTP_HOST} ^(example\.host\.com)(:80)? [NC,OR]
RewriteCond %{HTTP_HOST} ^(www\.example\.host\.com)(:80)? [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
アクセス制限
サーバ変数を取得して、アクセス制限を掛けます。
アクセス制限は、サーバに思わぬ負荷をかけることがあります。
不必要なアクセス制限はできるだけ掛けないようにしてください。
*注
十分にアクセス情報を解析してから設定してください。 設定によっては正当な訪問者もアクセスできなくなる可能性があります。
- [F] は、「Forbidden(アクセス禁止)」を意味します。
- 特殊文字の前に "\"(日本語環境では円マーク)を付加する事に注意してください。
- "REMOTE_HOST" は、サーバーによっては取得できない場合があります。
◇特定のホストからのアクセスを全て禁止する
RewriteCond %{REMOTE_HOST} ^example\.com$ [NC, OR]
RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.
RewriteRule ^.* - [F]
【解説】"REMOTE_HOST" が取得できない場合は、 "REMOTE_ADDR" を使用してアクセス制限をかけます。
◇特定のブラウザからのアクセスを全て禁止する
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/4\.0 \(compatible; MSIE 6\.0\)$ [NC]
RewriteRule ^.* - [F]
◇特定の Referer からのアクセスを全て禁止する
RewriteCond %{HTTP_REFERER} ^http://www\.example\.com/bad\.html$ [NC]
RewriteRule ^.* - [F]
◇特定の Referer 以外からのアクセスを全て禁止する(=特定の Referer からのみアクセスを全て許可する)
RewriteCond %{HTTP_REFERER} !^http://www\.example\.com/good\.html$ [NC]
RewriteRule ^.* - [F]
◇直リンクを全て禁止する
RewriteCond %{HTTP_REFERER} !example\.com [NC]
RewriteRule ^.* - [F]
【解説】Referer が "example.com" を含まないリクエストに対して、全てのアクセスを禁止します。
◇画像の直リンクを禁止する
RewriteCond %{HTTP_REFERER} !example\.com [NC]
RewriteRule \.(jpg|png|gif)$ - [F]
【解説】Referer が "example.com" を含まないリクエストに対して、拡張子が ".jpg" または ".png" または ".gif" へのアクセスを禁止します。
◇特定のホスト & 特定のブラウザからのアクセスを禁止する
RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/4\.0 \(compatible; MSIE 6\.0\)$
RewriteRule ^.* - [F]
◇特定の検索ロボット(クローラ)に対して、 "robots.txt" 以外のアクセスを禁止する
クローラのアクセス禁止は、サーバの負荷を伴います。
そこで先に、ここに記述する全てのクローラを "robots.txt" で拒否しておきます。
それを無視した悪質クローラだけを、最終的にここでアクセス禁止にします。
RewriteCond %{HTTP_USER_AGENT} Badbot-1 [NC, OR]
RewriteCond %{HTTP_USER_AGENT} Badbot-2 [NC, OR]
RewriteCond %{HTTP_USER_AGENT} Badbot-3 [NC, OR]
RewriteCond %{HTTP_USER_AGENT} Badbot-n [NC]
RewriteRule !^robots\.txt$ - [F]
【解説】"HTTP_USER_AGENT" が、 "Badbot-1", から "Badbot-n" の文字(文字の大小を区別しない)を含むクローラに対して、 "robots.txt" 以外のアクセスを禁止します。
※悪質クローラに対する対策の詳細は:
検索ロボット対策 をご覧ください。