自宅で動かしているサーバ、あるボランティア団体のWebコンテンツが置いてあるんですが、そこを見に行くと「文字化けする。HTTP Request Header見ると、Content-TypeでUTF-8が出てるよ〜。」という連絡をもらったので、色々調べてみたら・・・。
Apache2で文字化け
Debian上でApache2を使っているのだけど、文字化けそのものの原因は、
- /etc/apache2/conf.d/charsetというファイルが出来ていて、その中身が"
AddDefaultCharset UTF-8
"となっていた - 同時に有効にしてあったディスクキャッシュ(mod_disk_cache.so)で蓄積されていたheaderファイル内で"
Content-Type: text/html; charset=UTF-8
"となっていた
という二つが組み合わさったものでした。
まず、/etc/apache2/conf.d/charsetについては、Apache2のchangelogで、
apache2 (2.2.3-1) unstable; urgency=low
* Remove mention of AddDefaultCharset from apache2.conf as this is now
in /etc/apache2/conf.d/charset.
というのを見つけたので、これで多分間違いなし。
でも、腑に落ちないのが、ディスクキャッシュに関して。
モジュールを有効にしたり、無効にしたりすることで、ディスクキャッシュがおかしいというのは判ったのだけど、AdddefaultCharsetを明示的に"Off"に変更しても、ディスクキャッシュが有効だとContent-TypeがUTF-8でキャッシュされたデータが応答に使われる。
ということで、ディスクキャッシュをすべてクリアした後、AddDefaultCharsetを変更してブラウザでアクセスしたあと、キャッシュされたHeaderがどうなるのかチェックしてみたところ、
- "
AddDefaultCharset Off
"に設定→Apacheを再起動
→headerファイル内は"Content-Type: text/html
" - "
AddDefaultCharset UTF-8
"に変更→Apacheを再起動
→headerファイル内は"Content-Type: text/html; charset=UTF-8
" - "
AddDefaultCharset Off
"に再変更→Apacheを再起動
→headerファイル内は"Content-Type: text/html; charset=UTF-8
"
と言う結果に。
"Off→UTF-8"だとキャッシュの更新が行われるけど、その逆はキャッシュが更新されない。勿論キャッシュをクリアすれば、正しくキャッシュされるので、どうやらmod_disk_cache.soでのAddDefaultCharsetの扱いがおかしいんじゃないかと思うんだけど・・・。
とりあえず、運用上はmod_disk_cache.soを無効にしておけば問題ないのだけど、本当の原因ってなんなんだろう?
コメントする