RewriteRuleについて
MOBA_HOME/conf/rewrite.conf
MobaSiFでは、以下のようなURLでアクセスすることをサポートしている。
上記のURLでアクセスした場合、MobaSiFの設定により下記のURLに書き換わる。
このURLの書き換えを実際に行なっているのが、apacheのRewrite機能である。
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]
これについてどういう動作をしているのかを調べてみた。
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の
という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」に飛ばされるようになっている。
まとめ
Apacheの機能であるrewrite機能を調べた。rewrite機能は、アクセスしてきたURLを正規表現で柔軟に変換する機能を有している。MobaSiFでは、「MOBA_HOME/conf/rewrite.conf」でその設定が行なわれている。この設定を有効にするには、httpd.confに「Include rewrite.conf」と記述する必要がある(実際にはMOBA_HOME/conf/httpd.confをapacheのhttpd.confでインクルードするように設定する)。これにより、cgiプログラムに届く前にURLが整形されるようになる。
今回、rewrite.confを読んだことにより、MobaSiFがどのようなアクセスに対応しているのかを把握することができた。今後は、rewrite.confを書き換えることにより、新しいアクセス方式を追加したり、アクセス制限をかけたり、といったことを行なっていく予定である。