Apache 文字化け対策 AddDefaultCharset

CentOSのyumでインストールしたApacheでは、レスポンスに追加されるメディアタイプの文字セットパラメータがUTF-8に設定されているため、metaタグでUTF-8以外のcharsetを記述していても、ブラウザで無視されてWebアプリケーションやHMTLが文字化けします。

文字化けが起こる原因は、AddDefaultCharsetディレクティブにUTF-8が設定されていることなので、httpd.confに記述されているAddDefaultCharsetの設定自体をコメントアウトします。

vi /etc/httpd/conf/httpd.conf
---------------------------
#AddDefaultCharset UTF-8
---------------------------

AddDefaultCharset自体のデフォルト値はOffのため、コメントアウトすることでOffを設定したことと同じになります。
Offにしたことを明示したい場合は、次の様に記述すると良いでしょう。

AddDefaultCharset Off

文字化けの原因

実際にこの設定で何が変わるのかを見ていきましょう。AddDefaultCharsetの設定をUTF-8、Offにした場合のレスポンスヘッダにおけるContent-Typeの変化を示します。

UTF-8と設定した場合

$ curl -I 192.0.2.10
HTTP/1.1 200 OK
Date: Mon, 17 Mar 20XX 11:34:27 GMT
Server: Apache
Last-Modified: Mon, 17 Mar 20XX 07:42:00 GMT
Accept-Ranges: bytes
Content-Length: 125
Connection: close
Content-Type: text/html; charset=UTF-8 <= charsetが必ず表示される

Offと設定するかコメントアウトした場合

$ curl -I 192.0.2.10
HTTP/1.1 200 OK
Date: Mon, 17 Mar 20XX 11:34:41 GMT
Server: Apache
Last-Modified: Mon, 17 Mar 20XX 07:42:00 GMT
Accept-Ranges: bytes
Content-Length: 125
Connection: close
Content-Type: text/html <= charsetが表示されない

レスポンスヘッダのContent-Typeの文字コードがUTF-8となっていると、HTMLのmetaタグに設定されている文字コードがブラウザによって無視されるため、文字コードのミスマッチがあると文字化けが起こることになります。

ドキュメント: Apache AddDefaultCharset ディレクティブ