mod_rewrite & servlet
mod_rewrite を使って、 URL の ? から後ろのパラメーターを隠す方法。
この前 mod_rewrite を使ったときの続き。
今回は Struts 使ったシステムで試してみました。
……すんげー時間掛かった(汗)。
最初、 httpd.conf に
RewriteEngine on RewriteRule ^/test/index\.html$ /webapps-test/Start.do [PT]
って書いてたんですよ。ところがこれがまったくうまくいかない。
RewriteEngine on RewriteLog "D:\test\rewrite.log" RewriteLogLevel 9 RewriteRule ^/test/index\.html$ /webapps-test/Start.do [PT]
ってしてログを出して、このログと Apache の error.log を見てみたら、基本的にこの置き換えだと置換後の URL に DocumentRoot のパスがついちゃう。つまり D:/public_html/webapps-test/Start.do みたいなパスに変換されちゃうんです。
多分普通の CGI なら動くんでしょうねー、これ。 Perl とかの CGI は基本的に exe で、これを実行してその標準出力を受け取る、ってゆー仕組みなわけだから。
でもサーブレットはそうはいかないわけで。理論上は……
RewriteEngine on RewriteRule ^/test/index\.html$ http://%{HTTP_HOST}/webapps-test/Start.do [L]
ってすればちゃんとホスト名でアクセスするからうまくいく……んだけど、これだと URL まで変わっちゃうんで意味なし(汗)。そもそも URL 直指定で URL を改ざんできたらまずいわけだし……。
でー。
散々調べた結果、 mod_proxy と組み合わせるとうまくいきました。
まずは mod_proxy をオン。 httpd.conf の
- LoadModule proxy_module modules/mod_proxy.so
- AddModule mod_proxy.c
のコメントアウトを外せばOK。
んで、 RewriteRule のサフィックスに [P] をくっつければ完了。
RewriteEngine on RewriteRule ^/test/index\.html$ /webapps-test/Start.do [P]
こうすることで ServerName がプレフィックスについた URL で呼ばれる形になります。*1
……多分これでうまくいくかと。パラメーター分割して渡す、ってとこまではまだやってないから微妙だけど。
しかしこれ、はっきり言って無理なんじゃないかと思った……散々検索したんだけどぜんっぜん情報見つからないんだもの……。ちなみに解決のきっかけは2ちゃんねるでした(爆)。