[Apache] Apacheモジュールで既存のモジュールの処理をたまに横取りをしたい2
id:higepon:20050727:1122450362で、Apacheモジュールについて質問させていただきました。
結構悩んでいたのですが、なんとApacheモジュール プログラミングガイド (Advanced Server‐side programmingシリーズ)の筆者の小山さんから長文のアドバイスをいただきました。
小山さんありがとうございます。(´▽`)
私がはまっていたポイントは
SetHandler mod_test
とhttpd.confで設定していた部分です。
小山さんからのアドバイスにある通り
キモになるのは「SetHandlerは強制的にコンテンツハンドラを上書きする」という点かと思います。
SetHandlerをやるとコンテンツハンドラが上書きされてよろしくありません。
既存の設定を生かしつつ、ap_run_fixups()フェーズでハンドラを動的に変更することで、mod_rewriteなどの既存のモジュールに手を入れず、処理を横取りできるようになりました。
擬似コードは以下の通りです。
static int test_find_types(request_rec* r) { if (ある条件が成立したら) { /* mod_testのコンテンツハンドラを使う */ r->handler = ap_pstrdup(r->pool, "mod_test"); return DECLINED; } else { /* 条件が成立していないので mod_rewriteのコンテンツハンドラに任せる */ return DECLINED; } }