2010年1月25日月曜日

mod_proxy(ajp) + tomcatでリクエストパス部が勝手にデコードされる

はまって情報を探したんだけど、あまりなかったので書いておく。

apache+tomcatのよくある構成で、tomcat側に届いたリクエストをHttpServletRequest#getRequestUriで取得するとなんだか勝手にデコードされてる!

リクエストしたURL
http://hoge.com/tomcat-decode/%21%24%25%26%27%28%29*%2B%2C-./%3A%3B%3C%3D%3E
Tomcatに届いたときのgetRequestUriの結果
/tomcat-decode/!$%25&'()*+,-./:;%3C=%3E

URLエンコード済み文字が勝手にデコードされている。しかも全部が全部デコードをしているわけでなく、%25とか%3Cとかはそのまま。いろいろ試してみると、
  • マルチバイトをエンコードしたもの
  • RFC2396に書かれている"reserved","unwise"
はデコードされない様子。
で、結局のところ、apache 2.2.8 のmod_proxyのバグとしてレポートされているようです。
apache2.2の英語版ドキュメントにしか書いていないのですが、ProxyPass ディレクティブにnocanonというのを書くと余計なことをしないど「生」のまま送ってくれるようになるとのこと。
ProxyPass /context-path/ ajp://backend.example.com/ nocanon
上記の nocanon オプション自体は 2.2.7(リリースされていないバージョン)からあるのですが、2.2.9でさらにBugFixされたというかんじのようです。
Changes with Apache 2.2.7 (not released)
*) mod_proxy: Canonicalisation improvements. Add “nocanon” keyword to
ProxyPass, to suppress URI-canonicalisation in a reverse proxy. Also,
don’t escape/unescape forward-proxied URLs.
PR 41798, 42592 [Nick Kew, Ruediger Pluem, Roy Fielding, Jim Jagielski]
Changes with Apache 2.2.9
*) mod_proxy: Make all proxy modules nocanon aware and do not add the
query string again in this case. PR 44803.
[Jim Jagielski, Ruediger Pluem]

0 件のコメント: