IISとHTTPヘッダの話。

IIS7.5+ARR2でリバースプロキシを組んだときに気づいた話。

どうやらIISはHTTPヘッダの文字コードをシステムの既定のコードページとして取り扱うようになっているようです。

裏側のアプリケーションがヘッダ内にUTF-8な文字列を吐いてくれちゃう*1んですが、OS側のシステムロケールが日本語になっているせいか、cp932として読んでしまうようで。で、そこで再整形してから投げるようでクライアントには文字化けして到達する、と。

ドキュメントにも特に言及はなく、これを変更する手段も見つけられなかったので、おそらくそもそもマルチバイト文字を流すことは想定していないのでしょう。実際、HTTPヘッダにHTTPヘッダ自身のエンコードを指定する手段がないことから、HTTPヘッダ自体がASCII以外を扱うように作られていないと思われますし。

結局そのときは、UTF-8のまま通してくれるnginxだと化けないっぽいってことでnginxで構築し直したんですが、どうもこのエントリを書くに当たって軽く調べたら、(それを許容する)HTTPヘッダの中に非ASCII文字を入れたいときはMIMEエンコードを使うのが唯一の手段っぽいんで、戦犯は上流のアプリケーションっぽい*2ですね……。実はこの現象を検証するときに僕がFirefoxの開発者ツールで見てたレスポンスはMIMEエンコードを自動で解除してます、とかだったらまた話は変わりますが……。

*1:ファイルをダウンロードさせるときに、content-disositionでオリジナルのファイル名をUTF-8で吐く。

*2:いや、もしかしたらほとんどのブラウザがMIMEエンコードに対応していないのでそうするしかなかった、とかあるかもしれませんが。