Apache2で文字化け

自宅で動かしているサーバ、あるボランティア団体のWebコンテンツが置いてあるんですが、そこを見に行くと「文字化けする。HTTP Request Header見ると、Content-TypeでUTF-8が出てるよ〜。」という連絡をもらったので、色々調べてみたら・・・。


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を無効にしておけば問題ないのだけど、本当の原因ってなんなんだろう?

トラックバック(0)

コメントする