Rewrite機能
Rewrite機能の概要
Rewrite機能とは、アクセスのあったURLを、正規表現で書き換えてから処理する機能です。URLを正規表現で書き換えられるので、次のようなことは簡単に実現できます。
/~user_name といったユーザ用のURLを /u/user_name に書き換える場合
RewriteEngine on RewriteRule ^/~([^/]+)/?(.*) /u/$1/$2 [R]
この機能を利用する際は、mod_rewriteモジュールが使える環境になっているかどうか確認しましょう。設定ファイルの中に、次のような行があれば問題ありません。
LoadModule rewrite_module modules/mod_rewrite.so
Rewrite指示子
Rewriteの機能を制御する指定子を紹介します。
RewriteEngine
RewriteEngine On|Off
Rewrite機能自体のオン・オフを制御します。使いたいそれぞれのバーチャルホストに対してRewriteEngine指示子の設定が必要です。
ディレクトリごとの設定でRewrite処理を可能にするためには、RewriteEngine On に加えて、Option FollowSymLinks を可能にする必要があります。
RewriteBase
RewriteBase ベースURL
RewriteBase指示子は、Rewrite処理のベースになるURLを設定します。
下記は、/xyz にある拡張子 .html ファイルすべてを、.shtmlに変更します。
RewriteEngine On RewriteBase /xyz RewriteRule ^.+\.html$ $1.shtml
RewriteCond
RewriteCond %{サーバ変数名} 正規表現パターン
RewirteCondは、サーバ変数を参照して、それが指定した正規表現のパターンと一致していれば、次の条件を引き続き実行する、という指示子です。
下記は、サーバ変数HTTP_USER_AGENTを参照して、"Mozilla"という単語があれば次の行にあるReriteRuleを適用するという意味です。
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*
RewriteRule ^/$ /mozilla.html [L]
サーバ変数は、mod_rewrite事例集の翻訳ページでご確認ください。
RewriteRule
RewriteRule 正規表現パターン 置換パターン オプション
RewriteRuleは、URLを書き換えるための指示子です。正規表現はPerlとほぼ同じなので、正規表現の詳細はPerl講座の正規表現でご確認ください。第3引数のオプションは、その後の処理を指定します。オプションのデフォルト値は空ですので、オプションが設定されていない場合は何も処理せずに次の条件に移ります。
複数のオプションを追加する場合には、カンマで区切ります。
オプションの一覧(抜粋)
フラグ | 説明 |
---|---|
[F] | forbidden(force URL to be forbidden)
HTTPレスポンスの403(Forbidden)を返します。HTTPレスポンスの403はアクセス権限がないことを示します。 |
[G] | gone(force URL to be gone)
HTTPレスポンスの410(Gone)を返します。HTTPレスポンスの410は指定ファイルがないことを示します。 |
[L] | last(last rule)
Rewrite機能によるURL変換を終了します。 |
[N] | next(next round)
Rewrite処理を再実行します。ただし、変換済みのURLを対象とするので、プログラム言語で言うところのループ処理となります。 |
[NC] | nocase(no case)
大文字と小文字を区別しないようにします。 |
[C] |
chain(changed with next rule)
次の条件に移ります。現在のパターンと一致 |
[S] S=num |
skip(skip next rule(s))
現在の条件が一致しているとき、指定したN個の条件、RewriteRuleをスキップします。 |
[T] T=MIME |
type(force MIME type)
ターゲットファイルのMIMEタイプを、指定したMIMEタイプに設定します。たとえば、変換前のURLが .htmlとなっている場合、MIMEタイプはHTMLですが、それを .cgiなどプログラムファイルに書き換える場合は、このオプション指定が必要です。 |
RewriteLog
RewriteLog ファイル名
RewriteLog指示子は、実行したRewrite処理を記録するログファイル名を設定します。もし名前がスラッシュ( / )で始まっていなければ、Server Root の相対パスになります。トップレベルと<VirtualHost>ブロックにしか書けません。
ログ出力を止めるにはRewriteLog指示子をコメントアウトするか、RewriteLogLevel 0 にします。
設定例
RewriteLog "/var/www/logs/rewrite.log"
RewriteLogLevel
RewriteLogLevel 数値
RewriteLogLevel指示子は、Rewrite機能のログレベルを 0~9 の数値で指定します。トップレベルと<VirtualHost>ブロックにしか書けません。
RewriteLogLevelのデフォルト値は 0 で、ログを出力しません。その他の数字は実質的には全ての挙動をログします。ReriteLogLevelに高い値を使うと
Apacheサーバは非常に遅くなります。運用時はReriteLogLevelを2以下にするとよいでしょう。
Blogなど、プログラム呼び出しのURLを書き換える
googleなどのサーチエンジンは、プログラムを呼び出しているように見えるURLはあまり評価しない傾向にあります。Rewriteを使えば、URLからではCGIプログラムを呼び出しているようには見えないようすることが可能です。
たとえば、下記の例では、/cgi-bin/abcSPa_1-b_2.htmlというURLを、/cgi-bin/abc.cgi?arg=a_1-b_2に書き換えます。
RewriteEngine on RewriteBase /cgi-bin RewriteRule ([a-z_]+)SP(.+)\.html$ $1.cgi?arg=$2 [T=application/x-httpd-cgi,L]