blog

program

$_SERVER[‘DOCUMENT_ROOT’]がおかしい?

既存のマルチドメイン環境にMovableTypeやWordPressの動いている複数ドメインを移設する機会がありました。
MovableTypeはこの機会にVer.6系にバージョンアップすることになり、ライセンス上の制約もなくなったためメインドメインに設置して活用していくことにしました。

問題はWordPress、その他のPHPです。

サーバ環境変数の $_SERVER[‘DOCUMENT_ROOT’] から想定した値を取得できません。
移設先サーバに以前からあるドメインのPHPはメインドメインの DocumentRoot が取得できることを前提に書かれています。どちらを修正するにしても手間でリスクもあります。

昔からある問題らしい

VirtualDocumentRoot を使った場合の DocumentRoot環境変数 に関するバッドノウハウ

確かに、この環境は再起動しないでドメインを追加できます。
VirtualDocumentRootを利用しているということです。
便利ですが、やはりそれだけですむほど世の中甘くありません。
しかし2003年からとは、定期的に複雑なサーバ設定をする立場を離れて長いとはいえちょっと不勉強でした。

さてどうするか

上記リンクのPHPを.user.ini ファイルとしてドメインごとに配置できれば簡単なのですが、この環境では読み込んでくれませんでした。
どうすればいいのかと悩んでいたら……

解決策

あっさり見つけました。
php.iniの「auto_prepend_file」オプションです。

この環境の全てのPHPが実行される時点で、以下のようなソースを読み込むように設定しています。
これで移行ドメインのDocumentRootだけが修正できます。

<?php
$relative_hosts = array(
    'example.com',
    'www.example.com',
    'www2.example.com',
);
for ($idx = 1; $idx < 8; ++$idx) {
	$test_host = 'test' . $idx . '.example.com';
	$relative_hosts[] = $test_host;
	$relative_hosts[] = 'www.' . $test_host;
}
if (in_array($_SERVER['HTTP_HOST'], $relative_hosts)) {
    $_SERVER['DOCUMENT_ROOT'] = str_replace($_SERVER['SCRIPT_NAME'], '', 
        $_SERVER['SCRIPT_FILENAME']);
}
?>

もちろんexample.comは一例です。

P.S.

Perlで同様な処理をご存知の方はいらしゃいますでしょうか。
今のところは必要ないですし、そもそも環境変数を上書きできるのも危険だとは思いますが……