RewriteRuleについて

MOBA_HOME/conf/rewrite.conf

MobaSiFでは、以下のようなURLでアクセスすることをサポートしている。

http://www.uhouho.net/_bbs

上記のURLでアクセスした場合、MobaSiFの設定により下記のURLに書き換わる。

http://www.uhouho.net/?f=bbs

このURLの書き換えを実際に行なっているのが、apacheRewrite機能である。
Rewrite機能は、正規表現による柔軟なURLの書き換え機能を有している。
MobaSiFでは、下記のような設定がされている。

RewriteEngine On

RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK|OPTIONS)
RewriteRule .* - [F]

RewriteRule ^/\.([^/]+)/(.*)$ /$2?_u=$1 [QSA]
RewriteRule ^/_([^/\.]+)(\.html?)?$ /?f=$1 [QSA]

RewriteRule ^/static/(.*)$ /static/$1 [QSA,PT,L]
RewriteRule ^/$ /fcgi/index.fcgi [QSA,PT,L]
RewriteRule ^/(.*\.html)$ /fcgi/index.fcgi?f=page&page=$1 [QSA,PT,L]
RewriteRule ^/(.*\/)$ /fcgi/index.fcgi?f=page&page=$1 [QSA,PT,L]

これについてどういう動作をしているのかを調べてみた。

RewriteEngine On

この記述はRewrite機能をオンにするものである。

RewirteEngine Off

上記の記述にするとオフになる。

RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK|OPTIONS)

RewriteCondでは、「%{REQUEST_METHOD}」と正規表現「^(TRACE|TRACK|OPTIONS)」が一致するかどうかを見ている。
一致すれば次の行に書いてある「RewriteRule .* - [F]」に移る。

RewriteRule .* - [F]

RewriteRuleの記法は,

RewriteRule 一致パターン 置換パターン フラグ

となっている。この行では特に一致させて置換するようなことはしていない。
フラグで指定されている[F]はFORBIDDENを返すことを表している。
すなわち、前の行の記述と合わせると「TRACE、TRACK、OPTIONSのいずれかのメソッドでアクセスしてきたものに対しては、FORBIDDENを返す」という意味になる。
これらをperlで書くと以下のような感じになる。

if ($ENV{'REQUEST_METHOD'} =~ /^(TRACE|TRACK|OPTIONS)/) {
   $ENV{'PATH_INFO'} =~ s/.*/-/; # 意味ないぽ
   print "Status: 403 Forbidden\n\n";
   exit;
}
RewriteRule ^/\.([^/]+)/(.*)$ /$2?_u=$1 [QSA]

[QSA]は、「Query String Append」の略で、%{QUERY_STRING}を引数としてつけたいときに使うフラグである。
このフラグが付くと、置換結果は下記のものと等価となる。

/$2?_u=$1&%{QUERY_STRING}

RewriteRule ^/_([^/\.]+)(\.html?)?$ /?f=$1 [QSA]

この行は、MobaSiF

http://www.uhouho.net/_bbs

というURLの記述に対応している。アンダースコア以降のものを「f=bbs」に整形している。

RewriteRule ^/static/(.*)$ /static/$1 [QSA,PT,L]

[PT]フラグは、「Path Through」の略で、Rewriteを打ち切って、他の変換(Script Aliasなど)に渡すものである。
[L]フラグは、Rewrite機能の変換を打ち切ること指示するものである。
この記述では「http://www.uhouho.net/static/hato.html」というアクセスがあったとき、
「$MOBA_HOME/static/」にある静的ページ「hato.html」を直接読み込むことを表している。
結果的に変換前と変換後でURLに変化はないが、rewrite機能を打ちきるために記述されている。

RewriteRule ^/$ /fcgi/index.fcgi [QSA,PT,L]

なにも引数を連れていないときの変換である。
基本的に動的なページが呼び出されるときは、
「$MOBA_HOME/fcgi/index.fcgi」に飛ばされるようになっている。

RewriteRule ^/(.*\.html)$ /fcgi/index.fcgi?f=page&page=$1 [QSA,PT,L]

http://www.uhouho.net/hato.html

のような形式でアクセスがあったときの変換である。

RewriteRule ^/(.*\/)$ /fcgi/index.fcgi?f=page&page=$1 [QSA,PT,L]

http://www.uhouho.net/hato/

のような形式でアクセスがあったときの変換である。

まとめ

Apacheの機能であるrewrite機能を調べた。rewrite機能は、アクセスしてきたURLを正規表現で柔軟に変換する機能を有している。MobaSiFでは、「MOBA_HOME/conf/rewrite.conf」でその設定が行なわれている。この設定を有効にするには、httpd.confに「Include rewrite.conf」と記述する必要がある(実際にはMOBA_HOME/conf/httpd.confをapachehttpd.confでインクルードするように設定する)。これにより、cgiプログラムに届く前にURLが整形されるようになる。
今回、rewrite.confを読んだことにより、MobaSiFがどのようなアクセスに対応しているのかを把握することができた。今後は、rewrite.confを書き換えることにより、新しいアクセス方式を追加したり、アクセス制限をかけたり、といったことを行なっていく予定である。