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という概念がないため)
関連記事
- PHPでwebサーバー(apache/nginx)の実行ユーザー・グループを確認する方法
- リクエストヘッダーやリクエストボディーなどを取得する方法
- 負荷が高いときには503エラーを返す方法
- サイトの更新情報をPINGサーバに送信する方法
- PHPでロードアベレージを表示させる方法
- PHPでTwitterのツイートをする/ツイート一覧を取得する/検索する(API v1.1)
- インクルードパスを設定する方法
- オブジェクト(Object)を配列(Array)に変換する方法
- PHPでgzip圧縮形式(gz圧縮)のファイルを読み書きする方法
- PHPでfacebook投稿時に公開範囲を指定する方法
- PHPで複数の画像をfacebookに投稿する方法
- PHPでfacebookのフィード(ウォール)に投稿する方法
- PHPでのfacebookアプリの認証処理(APIを使うユーザー認証)
- MySQL関数のまとめ
- MySQLサーバに接続できるかどうかを確認する
- ディレクトリ内のファイルのパーミッションを一括で変更する
- POSTでアップロードできるファイルサイズの制限を変更する方法
- 暗号化・複合化を行う ブロック暗号
- date型やdatetime型と年月日時分秒への変換
- 関数・メソッドの存在を調べる方法
- PHPでTwitterのbotを作る方法 ツイートをする/ツイート一覧を取得する(API v1)
- strtotimeの指定
- PHPでHTMLメールを送る方法
- ディレクトリセパレータを短く定義する DIRECTORY_SEPARATOR
- モザイク画像を作る方法
- HTML内のアクセス解析タグを除去する方法
- HTMLのTABLEタグを簡単にCSVファイルに変換する方法
- 画像表示のときに指定サイズにリサイズする(画像の拡大縮小)
- テキストを可逆的な暗号化する Crypt_Blowfish
- PHPでwhois検索をする Net_Whois
- よく使うヘッダー関数のまとめ
- キャリア・世代を判別する
- mb_send_mailでCCやBCCを指定する 表示名を指定する
- より高速に、推測困難な一意なIDを生成する方法
- 画像ファイルを指定容量ぎりぎりに圧縮する
- 指定したHTTPヘッダーが送信済みあるいは送信予定に含まれているか
- マルチバイト文字列(日本語文字)を一文字づつ取り出す
- ファイルを削除する/フォルダを削除する
- ファイルを読み込む/ファイルに書き込む
- ディレクトリ内のファイル一覧を取得する
- quoted-printable文字列の変換
スポンサーリンク