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

レンタルサーバなどで複数のバーチャルホストを動的に扱う場合に、VirtualHostを毎回指定するのは面倒だし、再起動が必要なので VirtualDocumentRoot (mod_vhost_alias - Apache HTTP Server Version 2.2) を使ってみたところ、超便利ッ!

問題なくサブドメイン独自ドメインの動的割り当て(httpd再起動なし) が可能なのですが、サーバ環境変数の DocumentRoot (PHPだと $_SERVER["DOCUMENT_ROOT"]) が期待した通りの値になっていませんでした


Apacheのバーチャルホスト設定と環境変数について質問いたします… - 人力検索はてな
この質問の(3)の設定 やはりうまく動かないっぽい


アパッチのバグトラッキングシステムにもチケットが
26052 – DOCUMENT_ROOT environment variable set incorrectly with VirtualDocumentRoot
2003年からさんざんせっつかれてます


どうもApache環境変数は上書きできなさそうなので mod_vhost_alias.so を修正しました(修正してません)

PHPのサーバ環境変数を無理やり上書きする

もうとにかく動けばよくなってきたので PHP環境変数を無理やりサーバに上書きさせます

/etc/httpd/conf.d/vhost.conf (CentOS5.4 Apache2.23)

<VirtualHost *:80>
    UseCanonicalName    Off
    VirtualDocumentRoot /var/www/virtual/%0
    VirtualScriptAlias  /var/www/virtual/%0
    php_admin_value auto_prepend_file /var/www/document_root.php
</VirtualHost>

/var/www/document_root.php (↑で読み込ませてるスクリプト)

<?php
$_SERVER['DOCUMENT_ROOT'] = str_replace($_SERVER['SCRIPT_NAME'], "", $_SERVER['SCRIPT_FILENAME']);

これでゴリ押しで $_SERVER["DOCUMENT_ROOT"] が期待通りの値になりました!
他の言語とかオーバーヘッド? あーね。