第4章 運用・保守
A.97 RewriteRule
名前
RewriteRule
形式
RewriteRule URLパターン 置換文字列 [フラグ]
機能概要
URLを書き換えるためのルールを設定します。
RewtiteCondディレクティブなどのリライト関連のディレクティブと組み合わせて、柔軟にURLを書き換えることができます。
URLパターン
書き換えの対象となるURLを正規表現で指定します。
URLエンコードされたURLは、デコードされたURLが対象となります。
置換文字列
URLパターンにマッチした場合に、書き換えるURLを指定します。
以下の変数を指定することもできます。
- $N
Nには、1から9までの数値を指定します。
URLパターンに指定した正規表現のグループ化「括弧()」に対応した文字列に置き換えられます。
- %N
Nには、1から9までの数値を指定します。
最後に条件を満たしたRewtiteCondディレクティブの条件パターンに指定した正規表現のグループ化「括弧()」に 対応した文字列に置き換えられます。
- %{サーバ変数名}
サーバ変数を指定します。サーバ変数については、「付録B 環境変数とサーバ変数」を参照してください。
- %{ENV:環境変数名}
環境変数を指定します。環境変数については、「付録B 環境変数とサーバ変数」を参照してください。
- %{HTTP:ヘッダ名}
任意のHTTPリクエストヘッダを指定します。
-
-URLを書き換えません。
フラグ(省略可)
フラグを、角括弧([])で囲んで指定します。複数のフラグを指定する場合は、角括弧([])内にカンマ(,)で区切って指定 してください。
指定可能なフラグを以下に示します。
- redirect[=ステータス](または、R[=ステータス])
書き換えたURLで外部リダイレクトを実行します。
指定可能なステータスを以下に示します。[=ステータス]を省略した場合は、ステータスコード「302」(Moved
Temporarily)でリダイレクトします。
- permanent(または、301)
ステータスコード「301」(Moved Permanently)でリダイレクトします。
- temp(または、302)
ステータスコード「302」 (Moved Temporarily)でリダイレクトします。
- seeother(または、303)
ステータスコード「303」(See Other)でリダイレクトします。
- forbidden(または、F)
ステータスコード「403」(Forbidden)を返します。
RewtiteCondディレクティブに設定した条件で、Webサーバへのアクセスを禁止する場合などに指定します。
- gone(または、G)
ステータスコード「410」(Gone)を返します。
クライアントに、存在しないページにアクセスしていることを通知する場合に指定します。
- proxy(または、P)
ルールにマッチしている場合は、書き換えたURLをプロキシ要求とみなし、リバースプロキシとして動作します。
本 フ ラ グ を 指 定 す る 場 合 は 、LoadModuleデ ィ レ ク テ ィ ブ でmod_proxy、mod_proxy_connect、 お よ び mod_proxy_httpモジュールを設定する必要があります。
- last(または、L)
ルールにマッチしている場合は、URLの書き換え処理を終了します。後続のルールは適用されません。
- next(または、N)
一連の書き換え処理のルールを先頭のルールから再度実行します。すでに書き換えられたURLが対象となりま す。本フラグを指定する場合は、書き換え処理が無限に実行されないように、適切に終了条件を設定してくださ い。
- chain(または、C)
ルールにマッチしている場合は、後続のルールを適用します。ルールにマッチしていない場合、後続のルール はすべて適用されません。
- type=MIMEタイプ(または、T=MIMEタイプ)
ルールにマッチしている場合は、指定したMIMEタイプをContent-Typeヘッダに設定します。
注意
Servletサービスのアプリケーションにアクセスし、そのアプリケーションにおいてMIMEタイプが設定された場合、
本指定は無効となります。
- nosubreq(または、NS)
Webサーバ内で発生するサブリクエストには、ルールを適用しません。
クライアント(Webブラウザ)から末尾がスラッシュ(/)のURLが指定された際に、DirectoryIndexディレクティブで指 定したファイルに対するサブリクエストが発生しますが、そのサブリクエストはルールを適用しない場合などに使用 します。
- nocase(または、NC)
大文字小文字を区別せずにルールを適用します。
- qsappend(または、QSA)
書換え前のURLおよび置換文字列にそれぞれクエリ文字列(URL内のクエスチョンマーク(?)以降の文字列)が 存在する場合、置換文字列の末尾にアンパサンド(&)と書換え前のURLに指定されたクエリ文字列を追加しま す。本フラグを指定しない場合、クエリ文字列は置換文字列で上書きされます。
- noescape(または、NE)
書換え時のURLエスケープを抑制します。
通常、パーセント(%)やセミコロン(;)などの特殊文字は、16進表現の「%25」、「%3b」にエスケープされますが、本 フラグを指定した場合は、エスケープされません。
- passthrough(または、PT)
URLの書換え後、他のモジュールに制御を渡します。
書き換えたURLに対して、Aliasディレクティブ、ScriptAliasディレクティブ、およびRedirectディレクティブなどを使 用する場合に指定します。
- skip=数値(または、S=数値)
ルールにマッチしている場合、数値に指定した数の後続のルールの適用をスキップします。
- env=環境変数:値(または、E=環境変数:値)
ルールにマッチしている場合、指定した任意の環境変数に値を設定します。値には、置換文字列と同様に、$N および%Nも指定できます。$Nおよび%Nの指定方法については、置換文字列の説明を参照してください。
指定位置
グローバルコンテキスト、バーチャルホスト、ディレクトリ
省略値
なしモジュール
mod_rewrite注意事項
・ 本ディレクティブは、リライト機能を使用する設定である(RewriteEngineディレクティブに「On」を設定している)場合に 有効となります。
・ バーチャルホストで本ディレクティブを設定する場合は、バーチャルホストごとに設定してください。
バーチャルホストで本ディレクティブを設定すると、書き換えるURLのホスト名と<VirtualHost>セクションに指定したア ドレスの文字列が一致した場合、内部リダイレクトします。外部リダイレクトするように設定するには、フラグに「redirect[=
ステータス](または、R[=ステータス])」を指定してください。
・ 置換文字列にServletサービスのアプリケーションのURLを指定する場合は、外部リダイレクトまたはリバースプロキシ を設定してください。外部リダイレクトおよびリバースプロキシの設定方法については、使用例を参照してください。
使用例
クライアント(Webブラウザ)からリクエストを受信した場合に、本ディレクティブに設定した各ルールに従って書き換えられ たURLを以下の表に示します。
設定内容 クライアントからのリク エスト
置換後のURL(注)
RewriteRule ^/somepath(.*) /otherpath$1 GET /somepath/
pathinfo
/otherpath/pathinfo (内部リダイレクト) RewriteRule ^/somepath(.*) /otherpath$1 [R] GET /somepath/
pathinfo
http://thishost/otherpath/pathinfo (外部リダイレクト)
RewriteRule ^/somepath(.*) http://thishost/
otherpath$1
GET /somepath/
pathinfo
/otherpath/pathinfo (内部リダイレクト) RewriteRule ^/somepath(.*) http://thishost/
otherpath$1 [R]
GET /somepath/
pathinfo
http://thishost/otherpath/pathinfo (外部リダイレクト)
RewriteRule ^/somepath(.*) http://otherhost/
otherpath$1
GET /somepath/
pathinfo
http://otherhost/otherpath/
pathinfo
(外部リダイレクト) RewriteRule ^/somepath(.*) http://originhost/
otherpath$1 [P]
GET /somepath/
pathinfo
http://originhost/otherpath/
pathinfo
(リバースプロキシ) RewriteRule ^/(.+\.cgi)$ /cgi-bin/$1 [PT] GET /test.cgi?abc /cgi-bin/test.cgi?abc RewriteRule ^/(.+\.cgi)$ /cgi-bin/$1 [PT,QSA] GET /test.cgi?abc /cgi-bin/test.cgi?abc RewriteRule ^/(.+\.cgi)$ /cgi-bin/$1?xyz [PT] GET /test.cgi?abc /cgi-bin/test.cgi?xyz RewriteRule ^/(.+\.cgi)$ /cgi-bin/$1?xyz
[PT,QSA]
GET /test.cgi?abc /cgi-bin/test.cgi?xyz&abc
注)各ホスト名は、以下を意味します。
・ thishost:ルールが設定されているWebサーバ
・ otherhost:他のWebサーバ
・ originhost:プロキシ動作時のコンテンツ生成元のWebサーバ