ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)

2007年~2011年ごろまで はてなダイアリー に書いてた記事を引っ越してきました。

mod_rewriteの正規表現でPerl拡張正規表現の文字クラスを使って嵌った。

最初、こんなの書いてたんですよ。

RewriteRule ^(\w)+$ index.php?mdl=$1&%{QUERY_STRING} [L]

で、Windows版のApache2ではまともに動いてたんですが、LinuxのApache1.3にあげたら動かなくなって「え〜〜??」となってたんですが。

Apache 1.3 : POSIX正規表現
Apache 2.0 : Perl互換正規表現(PCRE)

だったのんですね。で、当然"\w"文字クラスはPerl互換正規表現でサポートされているもので、POSIXには無い。
・・・やられた。そーゆーことかー・・・。結局次のように修正。

RewriteRule ^([0-9a-zA-Z_,\-\.])+$ index.php?mdl=$1&%{QUERY_STRING} [L]

うーん、"(.+)"でも良かった気がするのだけれど、まぁ、いっか。

Pattern は現在の URL に適用される (Apache 1.1.x では System V8、Apache 1.2.x 以降では POSIX の)正規表現です。

http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html

Pattern is a perl compatible regular expression, which is applied to the current URL.

http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html

(斜線, 太字は自分がつけました。)

Perl 互換正規表現 (PCRE)
PerlPOSIX拡張正規表現さえも上回る豊富な文法を持っている。
...
また、Perl には以下の定義済み文字クラスがある。

正規表現 - Wikipedia