環境が変わったら Tomcat が文字化けするようになったので 調査してくれと依頼されて調べた。

結論から言ってしまうと mod_rewrite と mod_jk を併用した場合の問題だったのだが 整理された情報が無くてはまったのでまとめとく。

発生条件:
URLパラメータに日本語を使っていて mod_rewrite と mod_jk を経由して Tomcat にリクエストを渡す場合、文字化けが発生する。

原因:
mod_jk の設定に以下の設定が有る場合、 mod_rewriteが日本語をデコードしてしまうので文字化けする。
JkOptions +ForwardURICompat

解決方法:
mod_jk の設定を以下に変更する。但し、mod_jk-1.2.24 以降が必要。
JkOptions +ForwardURIProxy

問題の本質:
  • mod_rewrite と Tomcat がどちらもURL内のエスケープ文字(%xx) を自前で解析したいため矛盾が発生する。
  • mod_jkがどちらを優先するかのデフォルトの設定を2転3転させているため 混乱に拍車がかかっている。

    バージョンとデフォルト動作の整理。
    mod_jk Ver.デフォルト設定 動作
    〜1.2.22 ForwardURICompat mod_jkに渡すURLはmod_rewriteを通す。
    %xxはデコードされる。
    1.2.23 ForwardURICompatUnparsed mod_jkに渡すURLはmod_rewriteを通さない。
    %xxはデコードされない。
    1.2.24〜 ForwardURIProxy mod_jkに渡すURLはmod_rewriteを通す。
    mod_rewriteが操作した所以外は%xxはデコードされない。




  • 最新版の mod_jk はデフォルトの ForwardURIProxy でほぼ問題無いはずなのですが 日本語公式サイトの設定例に ForwardURICompat が指定されていたりするので コピペしちゃう人がいたりしそうです。

    • 内容が古い:http://www.jajakarta.org/tomcat/tomcat-jk2/ja/docs/jk/aphowto.html

    まあ、URLに日本語使うなって言うのが正論なんでしょうけど 現実にはそうもいかないですしね...

    その他の参考サイト:

    • http://tomcat.apache.org/connectors-doc/reference/apache.html
    • http://d.hatena.ne.jp/kusakari/20070616/1181971048
    • http://d.hatena.ne.jp/kusakari/20080325/1206417188