rubyスクリプトでRewriteMapを書く際の注意点
公開:2003年07月01日参考文献:mod_rewriteモジュール URL 書き換えエンジン(Apache.jp)
RewriteMapは各ユーザーの.htaccess内では定義できない。サーバの設定ファイル内(ふつうhttpd.conf?)で定義する必要がある。
サーバの設定ファイル内で定義したRewriteMapを各ユーザーの.htaccessから使用することはできる。(サーバの設定ファイルで
RewriteOptions inherit
と明示しておく必要は…ないのかな。手元の環境ではコメント化しても受け継がれてるみたい)
たとえば
RewriteMap zot prg:/foo/bar/zot.rb
RewriteRule ([0-9]{4}-[0-9]{2}-[0-9]{2}-[0-9]{2}).html ${zot:$1|not_exist}
のようにして使用する。
一行目がRewriteMapの宣言。zotがこのMapにつけた名前で、のちのちこの名前を使って参照される。prg:はMapとして外部プログラムを使いますよ〜、とmod_rewriteに教えるおまじないでそのあとにつづいているのがプログラムのパス。
二行目で実際にzotを呼び出している。形式は${マップ名:引数|デフォルト値}. この場合の$1は正規表現の後方参照。引数は終端に改行文字が追加された形でRewriteMapプログラムに渡される。デフォルト値であるnot_existはRewriteMapがNULLを返した際に使用される。
RewriteMapとして使用するスクリプトには当然実行ビットを立てておく必要がある。
RewriteMapとして動くプログラムは標準入力から引数を受け取り、結果を標準出力に吐き出すフィルタとして動作する。
入出力をバッファリングされるとまずいので、スクリプトの内部で
$stdin.sync = 1 $stdout.sync = 1
のように指定しておく必要がある。
出力は改行文字で終端せよ、ということなので、スクリプトの中で
print "foo.rb?s=#{line}\n"
のようにして指定していたら、改行が二つ出力されて書き換え結果が妙なことになってしまいました。末端の改行文字を削ったら意図どおりに動くようになったのだけれど、
$stdout.puts("foo.rb?s=#{line}")
のように記述しておくのがおそらく一番面倒がないのだと思います。
