.htaccess - URLの書き換え

外部から要求されたリクエストを ".htaccess" ファイルで書き換えてリダイレクトします。ファイルの移転、ディレクトリーの再編成、サイト移転、更にはアクセス拒否まで絶大な効果を発揮します。

具体的には、要求されたリクエスト URL を Apache の "mod_rewrite" 拡張モジュール(URL書き換えエンジン)を使用し、 正規表現を使って書き換えます。 "Redirect(URL 転送)" とは異なり、リクエストの URL が実在しなくても転送が可能です。

".htaccess" ファイルでの設定はその分処理が遅くなります。サーバー管理者は、"httpd.conf" での設定を推奨します。

サーバー条件

Apache1.2 以降で使用可能。
Apache の "httpd.conf" で、"mod_rewrite" モジュールが利用可能になっている必要があります。

Riwrite の書式

ディレクティブと書式 初期値 説明
RewriteEngine on/off off 書き換えの可否を設定します。
RewriteOptions inherit - 現在の設定値を親ディレクトリの設定値から強制的に継承する。
RewriteBase / / 書き換えのベースとなるパス。ベースが明白な場合は不要です。
RewriteCond テスト文字列 パターン - テスト文字列とパターンを比較します。
RewriteRule パターン 置換対象 - パターンに合致した文字列を、置換対象に書き換えます。

オプション

書式 説明
[R] Redirect. 強制的にリダイレクトする。
[R=301] : 永久的に移動。HTTP レスポンスの「301 : Moved Permanently」を返します。
[R=302] : 一時的な移動。HTTP レスポンスの「302 : Moved Temporarily」を返します、デフォルト。
[F] Forbidden. 強制的にアクセス禁止にする。
HTTP レスポンスの「403 : Forbidden」を返します。
[G] Gone. 強制的に消去済みにする。
HTTP レスポンスの「410 : Gone」を返します。 もはや存在しないページを消去済みとしてマークします。
[L] Last. 書き換えが行われたら終了する。
現在の書き換え後の URL が、後続のルールによってそれ以上書き換えられることを防止します。
[NC] No Case. パターンについて、文字の大小を区別しない。
つまり、"A-Z" と "a-z" は区別されません。
[OR] Or. 複数の比較条件を行います。

正規表現

文字 説明
! 否定。
. 任意の1文字。
[] 括弧内のいずれかの文字。
[^] 括弧内のいずれかの文字以外。
| または。
? 直前の文字の0回または1回の繰り返し
* 直前の文字の0回以上の繰り返し。
+ 直前の文字の1回以上の繰り返し。
() 選択範囲の境界を明示する、もしくは後方参照を作成する。
^ 行頭。
\$ 行末。
\$n (0 <= n <= 9) 後方参照。n番目の()内の値が入ります。
%{} サーバ変数の取得。
\ 逆スラッシュ(日本語環境では円マーク)。パターン内で正規表現の特殊文字をエスケープする。

サーバ変数

変数名 説明
HTTP_USER_AGENT ブラウザの種類とバージョン。
HTTP_REFERER 参照元の URL 。
HTTP_COOKIE 設定されているクッキー情報。
HTTP_FORWARDED プロキシサーバ情報。
HTTP_HOST 接続要求しているホスト名。
HTTP_PROXY_CONNECTION 接続先プロキシサーバとの接続状態。
HTTP_ACCEPT ブラウザが認識可能なデータ形式。
DOCUMENT_ROOT サイトのルートディレクトリ。
SERVER_ADMIN サーバ管理者のメールアドレス情報。
SERVER_NAME サーバのホスト名、ドメイン名、またはIPアドレス情報。
SERVER_ADDR サーバのIPアドレス。
SERVER_PORT 送信に使われたサーバのポート番号。
SERVER_PROTOCOL 送信に使われたプロトコルの名前とレビジョン情報。
SERVER_SOFTWARE 起動したサーバソフトウエアの名前とバージョン情報。
REMOTE_ADDR リモートホストのIPアドレス情報。
REMOTE_HOST リモートホストのドメイン名。
REMOTE_USER ユーザの認証名。
REMOTE_IDENT リモートホストのユーザ名。
REQUEST_METHOD リクエストを送信した方法。
REQUEST_URI リクエストされたURI。
SCRIPT_FILENAME 現在実行しているスクリプト名。
PATH_INFO クライアントから送られるパス情報。
QUERY_STRING URL に付加して渡された "?" 以降の文字列。
AUTH_TYPE ユーザを認証するときに使用する認証方法。
TIME_YEAR サーバのシステム日付・年
TIME_MON サーバのシステム日付・月
TIME_DAY サーバのシステム日付・日
TIME_HOUR サーバのシステム日付・時
TIME_MIN サーバのシステム日付・分
TIME_SEC サーバのシステム日付・秒
TIME_WDAY サーバのシステム日付・曜日
TIME サーバのシステム日付・Unix タイムスタンプ。

一般的な書式

".htaccess" をドキュメント ルートの直下に置いた場合
RewriteEngine on
RewriteBase /

# ドメインの統一
RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

# ファイルの移転
RewriteRule ^old_dir\/index\.html$ /new_dir/index.html [R=301,L]

# ディレクトリの移転
RewriteRule ^old_dir\/(.*)$ /new_dir/$1 [R=301,L]

# クローラのアクセス禁止
RewriteCond %{HTTP_USER_AGENT} Badbot-1 [NC, OR]
RewriteCond %{HTTP_USER_AGENT} Badbot-2 [NC]
RewriteRule !^robots\.txt$ - [F,L]

RewriteEngine off

*注 書き換え対象に正規表現の特殊文字が含まれる場合は、逆スラッシュ(日本語環境では "\")でエスケープします。
*注 書き換え対象 "old_dir" が、「"/" から始まっていない」ことに注意してください。
*注 書き換え後の "new_dir" が、「"/" から始まっている」ことに注意してください。
*注 サーバーによっては、最後に "RewriteEngine off" を記述しない方が、正常に動く場合があります。

".htaccess" をサブディレクトリに置いた場合
RewriteEngine on
RewriteBase /example/

# ファイルの移転
RewriteRule ^old_dir\/index\.html$ new_dir/index.html [R=301,L]

# ディレクトリの移転
RewriteRule ^old_dir\/(.*)$ new_dir/$1 [R=301,L]

*注 置換対象も書き換え後も "/example/" を除いて記述します。
*注 書き換え後の "new_dir" が、 「"/" から始まっていない」ことに注意してください。

Rewrite の記述例

以下、".htaccess" をドキュメント ルート直下に置いた場合を想定して記述します。
サブディレクトリにおいた場合は、上記の記述様式に従って変更してください。

ドメインの統一

サーバーは1つのドメイン、例えば "example.com" に対して、"www.example.com" でもリクエストを受け付けます。
これは、SEO 対策上あまり好ましいことではありません。ここでは、"Rewrite" を使って、"www.example.com" に統一する場合を記述します。

RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

【解説】
".*" = 任意の1文字の0回以上の繰り返し。従って、^(.*)$ は、行頭から行末までの全ての文字列という意味になります。(.*) の値が、後方参照 $1 に入ります。

◇ファイルの移転◇

リクエストに対して、ファイルが移転したことを知らせます。

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]
拡張子の変更

リクエストに対して、ファイルの拡張子を書き換えてリダイレクトします。

# 特定のファイルの拡張子 ".php"を、".html" に変更する
RewriteRule ^example\.php$ /example.html [R=301,L]

# 拡張子が ".php" のファイルを、全て ".html" に変更する
RewriteRule ^(.*)\.php$ /$1.html [R=301,L]

# 特定のディレクトリに対して、全てのファイルの拡張子を変更する
RewriteCond %{REQUEST_URI} ^/example/
RewriteRule ^(.*)\.php$ /$1.html [R=301,L]

# 特定のディレクトリを除いて、全てのファイルの拡張子を変更する
RewriteCond %{REQUEST_URI} !^/example/
RewriteRule ^(.*)\.php$ /$1.html [R=301,L]
サーバ移転(サイトの引越し)

リクエスト全体を、新しいドメインへリダイレクトします。

RewriteRule ^(.*)$ http://www.new-example.com/$1 [R=301,L]

【解説】HTTPステータスコード [R=301](Moved Permanently) を付加することにより、URLが永久に移動したことを、検索サイトのクローラに通知します。 この処理で、旧サイトのページランクを、自動的にほぼ引き継ぐことができます。
検索サイトへの反映は、クローラにもよりますが、1週間から1ヶ月ほどかかります。

ファイルの消去

リクエストに対して、そのファイルやディレクトリが削除されたことをクローラに知らせます。

# ファイルの消去
RewriteRule ^example\/index\.html$ - [G]
# ディレクトリの消去
RewriteRule ^example\/(.*)$  - [G]

【解説】クローラに[G=410]を通知することで、該当するファイルを検索サイトから消去することができます。

アクセス制限

サーバ変数を取得して、アクセス制限を掛けます。
アクセス制限は、サーバに思わぬ負荷をかけることがあります。不必要なアクセス制限は、できるだけ掛けないようにしてください。
*注 十分にアクセス情報を解析してから設定してください。設定によっては、正当な訪問者もアクセスできなくなる可能性があります。

【解説】[F] は、「Forbidden(アクセス禁止)」を意味します。
パターン内では、特殊文字の前に逆スラッシュ(日本語環境では "\")を付加する事に注意してください。

直リンクを全て禁止する
RewriteCond %{HTTP_REFERER} !mydomain.com [NC]
RewriteRule ^.* - [F,L]

【解説】Referer が "mydomain.com" を含まないリクエストに対して、全ての直リンクを禁止します。
*注 これは、直リンク(他のサイトの内容をそのまま、読み込んで利用する)を排除するもので、通常のリンクは禁止されません。
ただし、予期せぬ所に影響を及ぼす可能性がありますので、全てを禁止するのはお勧めできません。

外部からの画像や動画への直リンクを禁止する
RewriteCond %{HTTP_REFERER} !mydomain.com [NC]
RewriteRule \.(jpg|png|gif|flv|mp4)$ - [F,L]

【解説】Referer が "mydomain.com" を含まないリクエストに対して、拡張子が ".jpg", ".png", ".gif", "mp4", "swf" への直リンクを禁止します。
この記述によって、外部からの不要な通信を遮断し、帯域の消耗と通信速度の低下を防ぐことが出来ます。
悪質なサイトでは、他のサイトのファイルを無断で直リンクして提供しているところもあります。
特に、ファイルやプログラムのダウンロードを提供しているサイトでは、".zip", ".lzh", ".exe" 等、使用している拡張子を追加するのをお勧めします。

特定の検索ロボット(クローラ)に対して、"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,L]

【解説】"HTTP_USER_AGENT" が、 "Badbot-1", から "Badbot-n" の文字(文字の大小を区別しない)を含むクローラに対して、 "robots.txt" 以外のアクセスを禁止します。

*注 クローラのアクセス禁止は、エラーログを肥大させます。回避方法は、.htaccess - 検索ロボット対策 をご覧ください。

Google Sponsored

コメント

このページに関する、ご感想やご質問をお寄せください。
お名前と都道府県名は、正確にお書きください。 - 泰山 -

お名前: *必須
都道府県: *必須
コメント: *必須

まだコメントは有りません。