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 件のコメント:
コメントを投稿