[PHP-users 33830] .htaccessのmbstring系の設定がディレクトリをまたいで他のphpに反映されてしまう現象について

kurt emperor.kurt @ gmail.com
2008年 7月 16日 (水) 00:50:38 JST


はじめまして。初めて投稿させていただきます、kurtと申します。
よろしくお願いいたします。


■サーバ環境
CentOS 5.2
apache 2.2.3(yumでインストール)

phpはyumでインストールした場合、--enable-zend-multibyteが有効になってい
ないため、

ftp://ftp.iij.ad.jp/pub/linux/centos/5.2/os/SRPMS/php-5.1.6-20.el5.src.rpm
をDLし、
rpm -ivh php-5.1.6-20.el5.src.rpm 
を実行したあと、/usr/src/redhat/SPECS/ 以下に設置されるspecファイル
(php.spec)のconfigureオプション部分に--enable-zend-multibyteを追加して、
rebuild、インストールを行ったもので動かしています


■phpinfoのmbstringまわりの表示項目(関係ありそうな部分だけ抜粋)

Directive                      |Local value|Gloval value
-------------------------------+-----------+--------------
mbstring.detect_order          |auto       |auto
mbstring.encoding_translation  |On         |On
mbstring.func_overload         |0          |0
mbstring.http_input            |auto       |auto
mbstring.http_output           |pass       |pass
mbstring.internal_encoding     |UTF-8      |UTF-8
mbstring.language              |Japanese   |Japanese
mbstring.script_encoding       |no value   |no value
mbstring.strict_detection      |Off        |Off
mbstring.substitute_character  |no value   |no value


■発生している現象
今回発生している現象は、なぜか.htaccessに設定したphpのmbstring関係の設定
がディレクトリツリー的にまったく別のディレクトリのphpにも影響してしまう
という現象です。
本来なら.htaccessの設定は設置したディレクトリ以下にのみしか設定は反映さ
れないものだと思うのですが、こういう挙動はphp特有の仕様なのか(それとも
発見されていないbug・・?、既知のbug? googleで調べたがhitしなかった)、
情報があれば教えてほしいと思います。以下は再現方法の説明です。


とあるディレクトリ(dir1とします)以下に.htaccessを設置し、php用の設定

php_value mbstring.script_encoding EUC-JP

を記述し、適当なphpファイル(dir1/test.phpとします)を設置します。

※dir1/test.php(いたって単純なPHPです。EUC-JPで記述)
-------------------------------------
<?php
print "あいうえお\n";
?>
-------------------------------------

次にディレクトリツリー的にもまったく別のディレクトリ(dir2とします)に以
下に同じPHP(dir2/test.phpとします)を設置します。ただしdir2/test.phpの文
字コードはUTF-8にしておきます。

※階層を簡単に説明するとこのような感じにしておきます
.
├─dir1
│      .htaccess(mbstring.script_encodingを設定)
│      test.php(EUC-JPで記述)
│
└─dir2
        test.php(UTF-8で記述)


ブラウザからdir1/test.phpをアクセスすると「あいうえお」とEUC-JPで表示さ
れます。
次にdir2/test.phpにアクセスすると本来なら「あいうえお」とUTF-8で表示され
るはずですが、dir1/.htaccessのmbstring.script_encodingの設定が反映されて
いるような挙動をするため文字化けてしまいます。dir2/test.phpのソースの文
字コードはUTF-8なのですが、mbstring.script_encodingの設定が効いてしまっ
ているため、EUC-JPとして動作しているように思えます。
apacheを再起動し、dir2/test.phpにアクセスするとおかしな動作は解消されま
す。ただしdir1/test.phpにアクセスし、dir2/test.phpにアクセスするとやはり
同じ現象が発生します。

※dir2/test.phpに1回アクセスしても、文字化けしない場合があるが、何回かリ
ロードすると文字化けする。これはおそらくapacheの子プロセスの数に影響して
くるのではないかと思われる。

さらにmbstring.substitute_characterを.htaccessに設定した場合も同じように
ディレクトリをまたいで反映されてしまいました。
例によってdir1/.htaccessにmbstring.substitute_characterの設定を行います

php_value mbstring.substitute_character 12307

次にdir1/test.phpを以下のように作成
※dir1/test.php(いたって単純なPHPです。EUC-JPで記述)
-------------------------------------
<?php
$str = "[はしご高]";
print mb_convert_encoding($str, "UTF-8", "EUC-JP");
?>
-------------------------------------

dir2にも同じスクリプトを設置します(dir2以下には.htaccessはなし)
これをブラウザからdir1/test.phpにアクセスすると、はしご高で文字コード変
換はうまくいかず、かわりにmbstring.substitute_characterで指定した文字が
出力されます。dir1の.htaccessの設定だと「〓」が表示されます。
いっぽうdir2/test.phpはmbstring.substitute_characterの設定はされていない
ので、「?」が出力されるはずですが「〓」が表示されてしまいます。

※今回もdir2/test.phpに1回アクセスしても、「?」が表示される場合があるが、
何回かリロードすると「〓」が表示される


どうもphpinfoで表示されるmbstring関係の設定項目の値が「no value」で、さ
らに.htaccess, ini_set関数(ここでの説明は省いていますが同じことが発生し
ました)で上書き設定できる項目でこのような現象が発生するみたいです。
いろいろと動作を試してみた結果、おそらくリクエスト時にno valueになってい
る項目に対しては.htaccessの設定がそのままphpの設定のデフォルト値として扱
われてしまっている気がします。

apacheの子プロセスがphpinfoでno valueになっている項目が.htaccessに上書き
設定されている場合、.htaccessが設定されている領域にアクセスがあると、
その設定を覚えてしまっている?
そのためapache restartすると一旦クリアされて、正しい挙動になるのではと考
えています(PHPは正直あまり詳しくないので推測です)

mbstring.http_inputは.htaccessで設定を変えても、ディレクトリをまたいでは
反映されませんでした。おそらく設定値が「no value」ではないからだと思いま
す。
また、mbstring関係以外で「no value」になっている項目で試してみたのですが
やはりディレクトリをまたいでは設定は反映されません
(mysql.default_passwordで試した)


かなり長文になってしまいましたが、もし何か知っている人がいれば、情報を提
供してほしいと思います。

※個人的にはbugだと思っているのですが・・

http://ml.php.gr.jp/pipermail/php-dev/2008-February/001391.html

mbstring関係でこういう情報もありますし(1の項目)。今回とは直接関係はな
さそうですが

-- 
kurt <emperor.kurt @ gmail.com>



PHP-users メーリングリストの案内