[an error occurred while processing this directive] [APACHE DOCUMENTATION]

モジュール mod_rewrite (バージョン 2.3)

このモジュールは Apache 1.2 以降のmod_rewrite.c ファイルに含まれまれます。 これは、リクエストされたURLをルールに基づいて書き換えるエンジンの 機能を提供します。 mod_rewrite はデフォルトではコンパイルされません。 mod_rewrite を使用する為にはコンフィグレーションファイルを 次の行のように構築しなければなりません。:
    Module  rewrite_module   mod_rewrite.o

概要

このモジュールはルールに基づいた書き換えエンジン(正規表現の文法に基づいて)を用いて、リクエストされたURLをその都度書き換えを行います。

これは、不正確な一致による無制限な追加のルール条件(HTTP のヘッダーを含むたくさんの変数を操作するため)と、先にある URL の代用による外部のデータベース検索(あるいはプレインテキストテーブル、DBM ハッシュファイルや、外部の処理によって)をサポートします。

次の両方を含む、フルのURL(PATH_INFOパートを含む)を操作します。 per-server文(httpd.conf)とper-dir文(.htaccess) とさらに結果のQUERY_STRINGの一部を生成することができます。 書き換えられた結果は、内部のサブプロセスで読み込むことが出来、外部のリクエストをリダイレクト(変換)するか、内部のProxyを通すことも可能です。

最新版は次にあります。
http://www.engelschall.com/sw/mod_rewrite/

Copyright © 1996 The Apache Group, All rights reserved.
Copyright © 1996 Ralf S. Engelschall, All rights reserved.

Written for The Apache Group by

Ralf S. Engelschall
rse@engelschall.com
http://www.engelschall.com/~rse

命令


コンフィグレーションの命令

RewriteEngine

Syntax: RewriteEngine {on,off}
Default: RewriteEngine off
Context: server config, virtual host, per-directory config

RewriteEngine 命令はランタイム書き換えエンジンを有効又は無効にします。 off をセットするとこのモジュールはランタイム処理を行いません。 そして更に環境変数SCRIPT_URxを更新します。

全ての RewriteRule 命令を無効にする為に、この命令を使ってください!


RewriteOptions

Syntax: RewriteOptions Option ...
Default: -None-
Context: server config, virtual host, per-directory config

RewriteOption 命令は、いくつかの特殊オプションである、現在のper-server またはper-directory コンフィグレーションをセットします。 Option文字列は次のようにできます:


RewriteLog

Syntax: RewriteLog Filename
Default: -None-
Context: server config, virtual host

RewriteLog 命令はサーバで書き換えたアクションを格納するファイル名をセットします。 ファイル名がスラッシュ('/') で始まらない時は、Server Rootからの相対パスとなります。 この命令はサーバの設定につき1つだけ行えます。

書き換え操作のログを行わないようにする際は、 Filename/dev/nullにする必要がありません。なぜなら書き換えエンジンは 内部的にログを出力していますが、ログファイルを生成しません。 これはサーバをスローダウンさせ、管理者になにも利益がありません! ロギングを無効にするにはRewriteLog 命令をを削除するかコメントアウト するか、RewriteLogLevel 0を使用してください!

Example:

RewriteLog "/usr/local/var/apache/logs/rewrite.log"


RewriteLogLevel

Syntax: RewriteLogLevel Level
Default: RewriteLogLevel 0
Context: server config, virtual host

RewriteLogLevel 命令は書き換えログの冗長性のレベルを設定します。 デフォルトレベルの0は何もロギングしません。9までまたはそれ以上は、 さらに多くのログ情報が書き出されます。

ログ出力を無効にするには、Level を0に設定してください。 これは全ての処理のログを無効にします。

注意: 高いLevel を使用すると劇的にApacheサーバは遅くなります! 書き換えログファイルはデバッグの時に使用し、少なくとも2以下のを使ってください!

Example:

RewriteLogLevel 3


RewriteMap

Syntax: RewriteMap Mapname {txt,dbm,prg}:Filename
Default: not used per default
Context: server config, virtual host

RewriteMap命令はキー検索を通してフィールドを挿入/代用するためにマッピング機能によってルール代理ストリングの中で使える外部のRewriting Mapを定義します。

Mapnameはマップの名前であって、書き換えルールの代理ストリングスのためにマッピング機能を指定するために使われます。

${ Mapname : LookupKey | DefaultValue }
このような命令がある時 マップMapnameは調べられ、キーLookupKeyは検索されます。もしキーが見つかれば、マップ機能命令はSubstValueによって代わりに割り当てられます。もしキーが見つからなければ、それはDefaultValueによって割り当てられます。

Filenameは次のフォーマットの一つを含んでいる有効な Unix ファイルパスです:

  1. Plain Text Format

    これはいずれかのブランク行、コメント行('#' で始まっている)を含んでいるアスキーファイルであるか、または

    MatchingKey SubstValue
    対ー行ごとに一つ。適当なエディタを使うか、またはmod_rewriteが分配するsupportディレクトリからmapcollectmapmergeというプログラムを使って、手動でこのようなファイルを作ることができます。

    txt:と一緒にマップの接頭部をFilenameとして示すこと:以下の例のようなストリング:

    #
    #   map.real-to-user -- maps realnames to usernames
    #
    
    Ralf.S.Engelschall    rse   # Bastard Operator From Hell 
    Dr.Fred.Klabuster     fred  # Mr. DAU
    

    RewriteMap real-to-host txt:/path/to/file/map.real-to-user
    

  2. DBM Hashfile Format

    これは、Plain Text Formatファイルと比べてバイナリー NDBM フォーマットファイルが同じ中身を持っていることを示します。Apache のsupportディレクトリにある、なんらかの NDBM ツールやdbmmanageプログラムを使ってそのようなファイルを作ることが出来ます。

    dbm:stringと一緒にマップの接頭部をFilenameとして示す。

  3. Program Format

    これは検索ファイルではなく、UNIX で実行可能なプログラムです。それを使うために言語を選択して使うことができるが、しかし結果は実行可能な UNIX バイナリーでな ければなりません(すなわち、オブジェクト・コードあるいはマジックのクッキーを持つスクリプトが先頭行として'#!/path/to/interpreter'をうまくいくようにします)。

    このプログラムは一度 Apache サーバの起動時に実行されていて、次にそのstdinstdoutのファイル・ハンドルの上のエンジンを書き換える情報を出します。それぞれのマップ機能検索のために、それはstdinの上にあるニューラインによって終結されたストリングとして、検索するべきキーを受け取るでしょう。それからそれは、stdoutの上のニューラインによって終結されたストリング、またはそれがだめなら``NULL''の4文字のストリングとして、検索された値を返さなければなりません(すなわち与えられたキーに対応する値がない)。1:1 のマップを実行するような(すなわち、キー==値)平凡なプログラムもあり得ます:

    #!/usr/bin/perl
    $| = 1;
    while (<STDIN>) {
        # ...here any transformations 
        # or lookups should occur...
        print $_;
    }
    

    しかし以下に気を付けて下さい:

    1. ``プログラムはシンプルかつ単純'' (KISS)にしておいて下さい。なぜなら、ルールが立ち上がっている時、もしこのプログラムがもたもたしていると、Apache サーバの接続を切断することになるからです。
    2. 一つの共通のミスは避けて下さい:stdoutの上で決してバッファに入れられた I/O をしないで下さい!これは deadloop を引き起こすことになります!それゆえ、上記の例の``$|=1''は ...

    prg:stringと一緒にそのようなマップ接頭部をFilenameとして示すこと

RewriteMap命令は以前よりも、もっと多く実行させることができます。それぞれのマッピング機能が、その書き換えているマップファイルを示す一つのRewriteMap命令を使うために。ディレクトリごとの中身のマップをはっきりさせることはできないが、それはもちろん、ディレクトリごとの中身のこのマップを使うことは可能です。

プレインテキストや DBM フォーマットファイルのために、検索キーがマップファイルのmtimeまで in-core でキャッシュされるか、サーバが再起動します。このようにあらゆるリクエストのために使われるルールでマップ機能を持つことが出来ます。これは問題ではありません。なぜなら外部検索はただ一度実行するだけですから!


RewriteBase

Syntax: RewriteBase BaseURL
Default: default is the physical directory path
Context: per-directory config

RewriteBase命令は、ディレクトリごとの書き換えに対してベースの URL を明白にセットします。以下にあるように、RewriteRuleはディレクトリごとのコンフィグファイルで使われることができます(.htaccess)。そこではそれは、ローカルに実行する。すなわち、ローカルなディレクトリの接頭部は、この処理の段階で外され、書き換えルールは残っているものだけに作用します。最後に、それは自動的に付け加えられます。

代理が新しい URL のために立ち上がる時、このモジュールはサーバの処理に URL を再導入しなければなりません。これを可能にするためには、対応する URL 接頭部、または URL ベースが何なのかを知る必要があります。デフォルトでは、この接頭部はそれ自身対応するファイルパスです。しかし、ほとんどのウェブサイトのURLsは物理的なファイル名のパスに対応していないディレクトリなので、この仮定は通常正しくないでしょう!そこで正確な URL 接頭部を指定するために、RewriteBase命令を使わなければなりません。

それで、もしウェブサーバの URLs が物理的なファイルパスに対応していないディレクトリならば、RewriteRule命令を使いたいあらゆる.htaccessファイルでRewriteBaseを使わなければなりません。

例:

以下のディレクトリごとのコンフィグファイルを仮定します:

#
#  /abc/def/.htaccess -- per-dir config file for directory /abc/def
#  Remember: /abc/def is the physical path of /xyz, i.e. the server
#            has a 'Alias /xyz /abc/def' directive e.g.
#

RewriteEngine On

#  let the server know that we are reached via /xyz and not 
#  via the physical path prefix /abc/def
RewriteBase   /xyz

#  now the rewriting rules
RewriteRule   ^oldstuff\.html$  newstuff.html

上記の例では、/xyz/oldstuff.htmlに対するリクエストが物理的なファイル/abc/def/newstuff.htmlに正確に書き換えています。

Apache ハッカーのために:
以下のリストは内部処理段階についての詳細な情報です:

Request:
  /xyz/oldstuff.html

Internal Processing:
  /xyz/oldstuff.html     -> /abc/def/oldstuff.html    (per-server Alias)
  /abc/def/oldstuff.html -> /abc/def/newstuff.html    (per-dir    RewriteRule)
  /abc/def/newstuff.html -> /xyz/newstuff.html        (per-dir    RewriteBase)
  /xyz/newstuff.html     -> /abc/def/newstuff.html    (per-server Alias)

Result:
  /abc/def/newstuff.html
これは非常に複雑に見えるが、正確な Apache の内部処理です。なぜなら、ディレクトリごとの書き換えが処理速度を遅くしているからです。それで、それが実行している時、(書き換え)リクエストは Apache kernel の中に再導入されなければなりません。しかし:これは深刻な遠周りのように見える一方、実はそうではありません。なぜなら、この再導入は Apache サーバに対して完全に内部で実行し、同じ手続きが Apache 内部の多くの他の操作によって使われているからです。それで目的と実行が正確であることが確信できます。


RewriteCond

Syntax: RewriteCond TestString CondPattern
Default: -None-
Context: server config, virtual host, per-directory config

RewriteCond命令はルール条件を定義しています。RewriteRule命令の一つかそれ以上前にRewriteCond命令がなければなりません。もしそのパターンが現在の URL の状態と合致していて、そしてこれらの追加条件も適用されるなら、以下の書き換えルールは使われるだけです。

TestStringはサーバの多様なフォームを含むストリングです。

%{ NAME_OF_VARIABLE }
NAME_OF_VARIABLEは以下のリストのストリングスになることができます:

HTTP headers:

HTTP_USER_AGENT
HTTP_REFERER
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_ACCEPT

connection & request:

REMOTE_ADDR
REMOTE_HOST
REMOTE_USER
REMOTE_IDENT
REQUEST_METHOD
SCRIPT_FILENAME
PATH_INFO
QUERY_STRING
AUTH_TYPE

server internals:

DOCUMENT_ROOT
SERVER_ADMIN
SERVER_NAME
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE
SERVER_VERSION

system stuff:

TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY

specials:

API_VERSION
THE_REQUEST
REQUEST_URI
REQUEST_FILENAME

これらの全ての変数は、類似の指名された HTTP MIME-headers、アパッチサーバのC変数や、UNIX システムのstruct tmフィールドと一致します。

注意:

  1. 変数 SCRIPT_FILENAME と REQUEST_FILENAME は同じ値、すなわちアパッチサーバの内部のrequest_rec構造filenameの領域を含んでいます。前者は一般的な CGI 変数名として知られているが、後者は REQUEST_URI に一貫して対応しています(request_recuri領域の値を含んでいる)。

  2. 追加のフォーマットがあります:%{ENV:variable}variableであればどんな Unix の環境変数でも有り得ます。これはアパッチのサーバ処理からgetenv()によって検索されます。

  3. もう一つ追加のフォーマットがあります:%{HTTP:header}headerであればどんな HTTP MIME-header 名でも有り得ます。これは HTTP のリクエストによって検索されます。例:%{HTTP:Proxy-Connection}は HTTPヘッダーの``Proxy-Connection:''の値です。

CondPatternは状態パターン、すなわちTestStringの現在の事例に当てはまる通常表記であり、TestStringは評価されて、その時CondPatternに対して対抗させられます。

注: CondPatternは多少の追記のある標準的なExtended Regular Expressionです:

  1. 合致しないパターンを指定するために'!'文字(感嘆マーク)をパターンストリングの先に付けることができます。

  2. CondPatternsにはいくつかの特別形があります。本当の通常表記ストリングの代わりに、以下のうちの一つを使うこともできます:

    • '-d' (is directory)
      パス名としてTestStringを扱い、それが存在して、そしてディレクトリであるかどうかをテストします。

    • '-f' (is regular file)
      パス名としてTestStringを扱い、それが存在して、そして標準ファイルであるかどうかをテストします。

    • '-s' (is regular file with size)
      パス名としてTestStringを扱い、それが存在して、そして0より大きい標準ファイルであるかどうかをテストします。

    • '-l' (is symbolic link)
      パス名としてTestStringを扱い、それが存在して、そしてシンボリックリンクであるかどうかをテストします。

    注: これらの全てのテストは、それらを無効にするための('!')ではない文字によって先に付けられます。

さらに、付加することによって3番目のRewriteCond命令に対するアーギュメントとしてCondPatternのために特別なフラッグをセットすることができます。

[flags]
Flagsは以下のフラッグのコンマで分けられたリストです。

例:

リクエストの``User-Agent:''というヘッダーによってサイトのホームページを書き換えるために、以下のものを使うことが出来ます:
RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla.*
RewriteRule  ^/$                 /homepage.max.html  [L]

RewriteCond  %{HTTP_USER_AGENT}  ^Lynx.*
RewriteRule  ^/$                 /homepage.min.html  [L]

RewriteRule  ^/$                 /homepage.std.html  [L]
解説: もしブラウザとして(それ自身が'Mozilla'と認識する)ネットスケープナビゲータを使っているなら、フレーム等を含む最大限のホームページを入手します。もし(ターミナルベースである)Lynx ブラウザを使っているなら、イメージや表等を含まない最小限のホームページを入手します。もしそれ以外のブラウザを使っているなら、標準的なホームページを入手します。


RewriteRule

Syntax: RewriteRule Pattern Substitution
Default: -None-
Context: server config, virtual host, per-directory config

RewriteRule命令は本当の書き換えを行なうのに有効です。この命令は、一度よりも多く実行することができます。それから、それぞれの命令が一つの書き換えルールを定義します。これらのルールの定義状態重要です。なぜなら作動中にルールを割り当てる時、この状態が使われるからです。

Patternは現在の URL に対して割り当てられた通常表記 (for Apache 1.1.x a System V8 and for Apache 1.2.x a POSIX) であり得ます。ここでこのルールが割り当てられた時、``current''は URL の値を意味します。これはオリジナルのリクエストされた URL ではないかもしれません。なぜなら、その前にルールのいくつかの数が合致していて、それに変更を加えることが有り得るからです。

通常表記のsyntaxについてのいくつかのヒント:

^           Start of line
$           End of line
.           Any single character
[chars]     One of chars 
[^chars]    None of chars 

?           0 or 1 of the preceding char
*           0 or N of the preceding char
+           1 or N of the preceding char

\char       escape that specific char 
            (e.g. for specifying the chars ".[]()" etc.)

(string)    Grouping of chars (the Nth group can be used on the RHS with $N)

更に、NOT 文字('!')は可能なパターン接頭句である。これはパターンを無効にして、言う効力を与えます。例えば:``if the current URL does NOT match to this pattern''.これは、ネガティブなパターンと合致するのがより良い、特別な場合か、または最新のデフォルトルールとして使われることができます。

注意! パターンを無効にする NOT 文字を使う時、パターンにグループ化されたワイルドカードを用いることは出来ません。これが不可能なのは、グループのためにパターンが合致しなくて、中身がないからです。その結果、もし無効なパターンが使われたら、代用ストリングの$Nを使うことはできません!

書き換えルールのSubstitutionは、Patternが合致したオリジナルの URL に代用(置き換え)られるストリングです。使用できるプレインテキストの横に

  1. pattern-group back-references ($N)
  2. server-variables as in rule condition test-strings (%{VARNAME})
  3. mapping-function calls (${mapname:key|default})
後部の記述はPatternに合致したN番目のグループの内容によって置き換えられる$N (N=1..9)という確認です。サーバ変数は RewriteCond命令のTestStringにとって同じようなものです。マッピング機能はRewriteMap命令によって行ない、そこで明白にされます。これら3種類の変数は、上記リストの状態で展開されます。

既に上で書かれたように、全ての書き換えルールはSubstitutionに割り当てられます(コンフィグファイルの定義状態で)。URL はSubstitutionによって完全に置き換えられ、書き換え処理はルールがなくなるまで続きます(Lフラッグによる明白な終端がない限りー以下参照)

'-'という特別な代用ストリングは:「代用がない!」ことを示す。愚かに聞こえるでしょうか?いいえ、いくつかの URLs にだけ合致して、代用を行なわない書き換えルールを提供する有効なものです。例えば、 代用が実行するよりも前に、割り当てられた1つより多くのパターンを持つことが可能なC(chain) フラッグと関連してです。

: 特別な特徴があります。http://thishost[:thisport] という代用フィールドが接頭句である時、mod_rewriteは自動的にそれを外します。この絶対的な外部方向転換の URLs の自動削除は、有効なものであり、ホストネームの部分が生じるマッピング機能と結合して使われる重要な特徴です。これを理解するには、以下の例のセクションの最初の例を見てください。

確認: 所有するサーバに対する無条件の外部方向転換が、http://thishostという接頭句では働かないのは、この特徴のせいです。そのような自己方向転換を完了するためには、Rフラッグを使わなければなりません。

さらに、追記することによってSubstitutionのための特別なフラッグをセットすることができます。

[flags]
3番目としてRewriteRule命令に。Flagsは以下のフラッグのコンマで区切られたリストです:

確認:サーバごとのコンフィグレーションファイルの完了した URL にPatternが追加されたことを決して忘れないで下さい。しかし、ディレクトリごとのコンフィグレーションファイルでは、代用が行われた後、ディレクトリごとの接頭句(いつも特定のディレクトリとっては同じ物!)がパターンの一致で自動的にremovedされ、自動的にaddedされます。この特徴は多くの種類の書き換えの基本になっています。なぜなら、この接頭句を外すことなしでは、常に実行可能とは限らない親ディレクトリと一致しなければならないからです。

一つ例外があります:もし代用ストリングが``http://''で始まっていれば、ディレクトリの接頭句は追加されず、外部方向転換やプロキシーのスループット(もしPフラッグが使われていれば!)が働きます!

注意!ディレクトリごとのコンフィフレーションファイルの書き換えエンジンを可能にするためには、これらのファイルで``RewriteEngine On''と可能になった``Option FollowSymLinks''をセットする必要があります。もし管理者がユーザディレクトリのFollowSymLinksの override を不可能にしていれば、書き換えエンジンを使うことはできません。この制限はセキュリティ上必要です。

ここには全ての可能な代用の組み合わせとその意味が記述してあります:

Inside per-server configuration (httpd.conf)
for request ``GET /somepath/pathinfo'':

Given Rule                                      Resulting Substitution
----------------------------------------------  ----------------------------------
^/somepath(.*) otherpath$1                      not supported, because invalid!

^/somepath(.*) otherpath$1  [R]                 not supported, because invalid!

^/somepath(.*) otherpath$1  [P]                 not supported, because invalid!
----------------------------------------------  ----------------------------------
^/somepath(.*) /otherpath$1                     /otherpath/pathinfo

^/somepath(.*) /otherpath$1 [R]                 http://thishost/otherpath/pathinfo
                                                via external redirection

^/somepath(.*) /otherpath$1 [P]                 not supported, because silly!
----------------------------------------------  ----------------------------------
^/somepath(.*) http://thishost/otherpath$1      /otherpath/pathinfo

^/somepath(.*) http://thishost/otherpath$1 [R]  http://thishost/otherpath/pathinfo
                                                via external redirection

^/somepath(.*) http://thishost/otherpath$1 [P]  not supported, because silly!
----------------------------------------------  ----------------------------------
^/somepath(.*) http://otherhost/otherpath$1     http://otherhost/otherpath/pathinfo
                                                via external redirection

^/somepath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo
                                                via external redirection
                                                (the [R] flag is redundant)

^/somepath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo
                                                via internal proxy

Inside per-directory configuration for /somepath
(i.e. file .htaccess in dir /physical/path/to/somepath containing RewriteBase /somepath)
for request ``GET /somepath/localpath/pathinfo'':

Given Rule                                      Resulting Substitution
----------------------------------------------  ----------------------------------
^localpath(.*) otherpath$1                      /somepath/otherpath/pathinfo

^localpath(.*) otherpath$1  [R]                 http://thishost/somepath/otherpath/pathinfo
                                                via external redirection

^localpath(.*) otherpath$1  [P]                 not supported, because silly!
----------------------------------------------  ----------------------------------
^localpath(.*) /otherpath$1                     /otherpath/pathinfo

^localpath(.*) /otherpath$1 [R]                 http://thishost/otherpath/pathinfo
                                                via external redirection

^localpath(.*) /otherpath$1 [P]                 not supported, because silly!
----------------------------------------------  ----------------------------------
^localpath(.*) http://thishost/otherpath$1      /otherpath/pathinfo

^localpath(.*) http://thishost/otherpath$1 [R]  http://thishost/otherpath/pathinfo
                                                via external redirection

^localpath(.*) http://thishost/otherpath$1 [P]  not supported, because silly!
----------------------------------------------  ----------------------------------
^localpath(.*) http://otherhost/otherpath$1     http://otherhost/otherpath/pathinfo
                                                via external redirection

^localpath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo
                                                via external redirection
                                                (the [R] flag is redundant)

^localpath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo
                                                via internal proxy

Example:

We want to rewrite URLs of the form
/ Language /~ Realname /.../ File
into
/u/ Username /.../ File . Language

上記の書き換えマップファイルは/anywhere/map.real-to-userの下に置いてあります。それから、アパッチサーバのコンフィグレーションファイルに以下の行を追加することだけをしなければばりません:

RewriteLog   /anywhere/rewrite.log
RewriteMap   real-to-user               txt:/anywhere/map.real-to-host
RewriteRule  ^/([^/]+)/~([^/]+)/(.*)$   /u/${real-to-user:$2|nobody}/$3.$1
上記の使用例と説明


検索文字
このJAPACHE!ニュースグループへ
( japache.mod.rewrite ) | JAPACHE!ニュースについて | JAPACHE!ホームページへ

このページの情報に関わる、ご質問、お問い合わせは、 japache@infoscience.co.jpまで。


The English original manual is here.

Index Home