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"] が期待通りの値になりました!
他の言語とかオーバーヘッド? あーね。