別のサーバー環境では、PHP $_SERVER['DOCUMENT_ROOT']
スーパーグローバルに末尾にスラッシュが付いている場合と付いていない場合があります。この問題は、Apache DocumentRoot
はhttpd.conf
ファイルで定義されています:
つまり、httpd.conf
に末尾のスラッシュが含まれていない場合、
<VirtualHost *:8880>
DocumentRoot /var/www/live/current
...
次にecho $_SERVER['DOCUMENT_ROOT']
は/ var/www/live/currentを与える必要があります
httpd.conf
に末尾のスラッシュが含まれている場合:
<VirtualHost *:8880>
DocumentRoot /var/www/live/current/
...
次にecho $_SERVER['DOCUMENT_ROOT']
は/ var/www/live/current /を与える必要があります
これはUbuntu 10.04の場合ですが、RHEL 5.5では、Apacheで何も定義されていなくても、末尾のスラッシュが$_SERVER['DOCUMENT_ROOT']
に追加されます。
なぜこれが起こるのか?欠落している構成パラメーターはありますか?
参考のため:
スラッシュが仮想ホスト間で変化している理由がわかりません。ちなみに、それは重要ですか?プログラムに新しいスラッシュを追加するだけで(二重スラッシュが存在する場合は削除してください)、問題は解決します。
私が使う
$realpath = realpath ($_SERVER['DOCUMENT_ROOT']."/");
$realpath = str_replace ("//", "/", $realpath);
http://httpd.Apache.org/docs/2.0/mod/core.html 言う:DocumentRootは、末尾のスラッシュなしで指定する必要があります。
Apache環境のドキュメントルートは、複数の場所で定義できます。
はい、httpd.conf
にはこれらの設定が含まれていますが、このファイルはデフォルト構成に使用されるため、上書きすることができます。
vhosts.d
およびsites-available
ディレクトリのvhost設定を確認することをお勧めします。
Domの回答はこの問題の解決策ですが、異なる環境で二重の「//」が発生する理由はstefanvescaのステートメントです。ローカルマシンで、仮想ホストを設定した.confファイル内で、定義されたドキュメントルートの最後に/を追加した可能性があります。
いずれにせよ、phpの$ _SERVER ['DOCUMENT_ROOT']を使用すると、構成の結果であるApache環境値が取得されます。これが、ある環境では「/」、別の環境では「//」の理由です。
提案されたソリューション:
$realpath = realpath ($_SERVER['DOCUMENT_ROOT']."/");
$realpath = str_replace ("//", "/", $realpath);
すべてのインストールで機能するわけではありません。
たとえば、私の場合:
$_SERVER['DOCUMENT_ROOT'] = "/www/site/"
$_SERVER['DOCUMENT_ROOT']."/" = "/www/site//"
realpath("/www/site//") = "/www/site"
str_replace("//", "/", "/www/site") = "/www/site"
以前と同じ問題。
あなたは最初の指示を次のように変更する必要があるかもしれません:
$realpath = realpath ($_SERVER['DOCUMENT_ROOT'])."/";
アザミ
DOCUMENT_ROOTに末尾のスラッシュがないと仮定します。
この値は、Webサーバー構成から渡されます
Apache
DocumentRoot /var/www/html
これは、追加するパスの先頭にスラッシュが必要であることを意味します。
パスの任意の場所にダブルスラッシュ「//」が存在しないことがわかっている(ファイルシステムに関連する場合、httpのURLで、いくつかの不具合がある場合があります)
$ cat /etc//issue Debian GNU/Linux 9 \n \l
DOCUMENT_ROOTの末尾にスラッシュがある場合は、sysadminに結果がないもののせいにすることができます:)
安全に無視しますか?