[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 メーリングリストの案内