DOCUMENT ROOTを得る $_SERVER["DOCUMENT_ROOT"]は使えない!

サーバー変数の中に $_SERVER["DOCUMENT_ROOT"] というのがあるが、これはバーチャルホストには対応していない。
バーチャルホストで $_SERVER["DOCUMENT_ROOT"] を取得すると、これはapacheに設定されているデフォルトのドキュメントルートとなり、 バーチャルホストに設定されていない条件でのアクセスに使用される値です。

SSLのURLの場合もバーチャルホストを使用していることがあります。

つまり汎用性を考えたときには $_SERVER["DOCUMENT_ROOT"] は使えない、使ってはいけないと思ったほうがよい。
(言い過ぎかもしれないが、、、)

例えば次のような設定になっていたとき

httpd.conf (httpd-vhosts.conf httpd-ssl.conf)

………
………
DocumentRoot "/var/www"
………
………

<VirtualHost *:80>
    ServerAdmin webmaster@example.com
    DocumentRoot /home/hoge/www.example.com
    ServerName www.example.com
</VirtualHost>

この場合、IPでアクセスされた時のドキュメントルートは /var/www になり、http://www.example.com/でアクセスされた時には /home/hoge/www.example.com になるが、 $_SERVER["DOCUMENT_ROOT"] の値はどちらも /var/www となる。

サンプルコード

<?php
function documentRoot(){
  if(!isset($_SERVER["SCRIPT_NAME"]) || !isset($_SERVER["SCRIPT_FILENAME"])){
    return false;
  }
  $name = $_SERVER["SCRIPT_NAME"];
  $filename = $_SERVER["SCRIPT_FILENAME"];

  $dr = substr($filename, 0, strlen($filename) - strlen($name));
  return str_replace("/",DIRECTORY_SEPARATOR,$dr);
}
?>

一般的なものには対応していますが、特殊なプログラムには対応していないかもしれません。
またSCRIPT_NAMEなどはwebからのアクセスで取得できる変数のため、バッチファイルなどサーバー内で直接実行する場合には取得できません。
(バッチなどはそもそもapacheを通らず、DOCUMENT ROOTという概念がないため)

関連記事

スポンサーリンク

CURRENT_TIMESTAMP関数 現在の日時を求める

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る