AddType で文字コード設定をすると,PHP スクリプトが解釈されなくなってしまう。いつの間にかそうなっていた。原因は不明。→解決しました。追記をご覧下さい。
■ ■ ■
起こっている問題とその経緯
このサイトで,一部文字化けの問題が発生している。いつからこのような現象が発生していたのかは分からない。パッケージの更新しているうちに,いつの間にかこうなったとしか考えられない。経緯は以下の通り。
環境は Vine Linux 3.2 kernel-2.4.31-0vl1.12, apache-1.3.33-0vl2.3, php5-apache-5.1.4-0vl1.4, php5-5.1.4-0vl1.4。
サイトの構成
このサイトは,ディレクトリによって文字コードが違う構成になっている。
パス |
文字コード |
.htaccess での文字コード指定 |
/ |
EUC-JP |
あり (EUC-JP) |
/archives |
EUC-JP |
なし |
/archives/200604 |
EUC-JP |
なし |
/archives/200404/Hitsujiyama |
UTF-8 |
あり (UTF-8) |
html ファイルには,EUC-JP や UTF-8 などのコード情報を meta タグで書いてある。EUC-JP の場合は次の通り。UTF-8 のファイルも同様である。
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" />
現象の詳細
文字コードが EUC-JP である,/ (ルート) の .htaccess には次のように書いてある。
AddType "text/html; charset=EUC-JP" .html
AddType application/x-httpd-php .html
UTF-8 のディレクトリ /archives/200404/Hitsujiyama の .htaccess は次のようになっていた。
AddType "text/html; charset=UTF-8" .html
php_value mbstring.internal_encoding UTF-8
しかし,その UTF のページをブラウザで見ると,PHP のコードが表示されてしまっていた。設置した当初は正しく動作していた。

PHP のコードが表示されてしまっている
こりゃひどい。
AddType application/x-httpd-php .html
AddType "text/html; charset=UTF-8" .html
php_value mbstring.internal_encoding UTF-8
php のための記述を最初に加えても,動作は同じ。文字化けは起こらないが,PHP は動作していない。
しかし,Addtype の順番を入れ替えると,PHP は解釈され動作する。
AddType "text/html; charset=UTF-8" .html
AddType application/x-httpd-php .html
php_value mbstring.internal_encoding UTF-8
ところが,今度は UTF-8 の文字が化けてしまう。PHP の方にも文字コードをつけて,「AddType "application/x-httpd-php; charset=UTF-8" .html」としても変化なし。

PHP は解釈されるが文字化けする
こんなトレードオフってあるだろうか???
原因は?
明確な原因は分からない。対策もどうしたらいいのか…。.htaccess の中の記述の順番が違うで PHP が動作したりしなかったりするということは,Apache に問題がありそうだ。.htacces の解釈は Apache がやっているからである。しかし,当時のバージョンも現在のバージョンも Apache 1.3.33 である。ということはビルドに問題があるのだろうか?
apache-1.3.33-0vl2.3 がいけないのか? php5-apache-5.1.4-0vl1.4 との関係は? 前のバージョンに戻して見ようかと思ったが,
# rpm -i --oldpackage apache_1.3.33-0vl2.2_i386.rpm
ファイル /usr/lib/apache/mod_imap.so (パッケージ apache-1.3.33-0vl2.2 から) は、パッケージ apache-1.3.33-0vl2.3 からのファイルと競合しています
ファイル /usr/lib/apache/mod_rewrite.so (パッケージ apache-1.3.33-0vl2.2 から) は、パッケージ apache-1.3.33-0vl2.3 からのファイルと競合しています
ファイル /usr/sbin/httpd (パッケージ apache-1.3.33-0vl2.2 から) は、パッケージ apache-1.3.33-0vl2.3 からのファイルと競合しています
ファイル /usr/share/man/ja/man1/htpasswd.1.gz (パッケージ apache-1.3.33-0vl2.2 から) は、パッケージ apache-1.3.33-0vl2.3 からのファイルと競合しています
ファイル /usr/share/man/ja/man8/httpd.8.gz (パッケージ apache-1.3.33-0vl2.2 から) は、パッケージ apache-1.3.33-0vl2.3 からのファイルと競合しています
ファイル /usr/share/man/ja/man8/suexec.8.gz (パッケージ apache-1.3.33-0vl2.2 から) は、パッケージ apache-1.3.33-0vl2.3 からのファイルと競合しています
ファイル /usr/share/man/man1/dbmmanage.1.gz (パッケージ apache-1.3.33-0vl2.2 から) は、パッケージ apache-1.3.33-0vl2.3 からのファイルと競合しています
ファイル /usr/share/man/man1/htdigest.1.gz (パッケージ apache-1.3.33-0vl2.2 から) は、パッケージ apache-1.3.33-0vl2.3 からのファイルと競合しています
ファイル /usr/share/man/man1/htpasswd.1.gz (パッケージ apache-1.3.33-0vl2.2 から) は、パッケージ apache-1.3.33-0vl2.3 からのファイルと競合しています
ファイル /usr/share/man/man8/ab.8.gz (パッケージ apache-1.3.33-0vl2.2 から) は、パッケージ apache-1.3.33-0vl2.3 からのファイルと競合しています
ファイル /usr/share/man/man8/httpd.8.gz (パッケージ apache-1.3.33-0vl2.2 から) は、パッケージ apache-1.3.33-0vl2.3 からのファイルと競合しています
ファイル /usr/share/man/man8/logresolve.8.gz (パッケージ apache-1.3.33-0vl2.2 から) は、パッケージ apache-1.3.33-0vl2.3 からのファイルと競合しています
ファイル /usr/share/man/man8/rotatelogs.8.gz (パッケージ apache-1.3.33-0vl2.2 から) は、パッケージ apache-1.3.33-0vl2.3 からのファイルと競合しています
ファイル /usr/share/man/man8/suexec.8.gz (パッケージ apache-1.3.33-0vl2.2 から) は、パッケージ apache-1.3.33-0vl2.3 からのファイルと競合しています
どわーっ。関連パッケージも同時に戻すにはどうすればよいのだろうか??? 一筋縄ではいかないようだ。現在のところ打つ手なし。
文字化けの参考になりそうなサイト
2007年1月16日追記:
1つの拡張子に2つの AddType を適用しようとしたのが間違いでした。文字化け問題は解決しました(nlog(n): 拡張子 html で PHP を動作させているときの文字化け問題が解決)。
Posted by n at 2006-08-28 22:38 | Edit | Comments (0) | Trackback(0)