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ちゃんねるでした(爆)。

*1:つまり、ローカルでテストするときは ServerName にローカルでの IP アドレス、外から見られるサーバーの場合は ServerName にはグローバルなドメイン名を、って変える必要があるってことです。