Apache リバースプロキシで文字化けする

2010/04/22
★★

Apache リバースプロキシを導入した際に文字化けが発生する場合の対処方法について紹介する。

開発用サーバーでは、文字化けが発生することはなかったが、運用サーバーで Apache リバースプロキシを経由した場合に文字化けが発生することがある。

これは、Apache リバースプロキシの文字コードとコンテンツの文字コードが異なる場合に発生する。

デフォルトでは、Apache 構成ファイル "httpd.conf" の "AddDefaultCharset" ディレクティブが "UTF-8" に設定されている。

#
# Specify a default charset for all content served; this enables
# interpretation of all content as UTF-8 by default. To use the
# default browser choice (ISO-8859-1), or to allow the META tags
# in HTML content to override this choice, comment out this
# directive:
#
AddDefaultCharset UTF-8

この場合、フォワード先の Web サーバーの文字コードに関わらず、クライアントへのレスポンスは、utf-8 となる。

対処方法としては、"AddDefaultCharset" をフォワード先の Web サーバーと同様に設定する。"AddDefaultCharset" に設定する値は、IANA に登録されている文字セット名を用いる。

Windows Shift-JIS の場合:
AddDefaultCharset Windows-31J

EUC の場合:
AddDefaultCharset Extended_UNIX_Code_Packed_Format_for_Japanese

また、"AddDefaultCharset " ディレクティブは、"VirtualHost" コンテキストでも利用できる。フォワード先の Web サーバー毎に文字コードが異なる場合は、以下のように定義する。

# Windows Shift-JIS
<VirtualHost *:80>
    ServerName shift-jis.webserver.local
    ProxyPass / http://192.168.1.200/
    AddDefaultCharset Windows-31J
</VirtualHost>
#EUC
<VirtualHost *:80>
    ServerName euc.webserver.local
    ProxyPass / http://192.168.1.204/
    AddDefaultCharset Extended_UNIX_Code_Packed_Format_for_Japanese
</VirtualHost>

"VirtualHost" コンテキストで、AddDefaultCharset で文字コードを明示的に指定しない場合は、上位のコンテキストで指定されている文字コードが使用される。

"httpd.conf" 編集後は、Apache を再起動する。

>/sbin/service httpd restart

AddDefaultCharset の詳細は、以下を参照。

Apache コア機能 - AddDefaultCharset ディレクティブ