Apache使用時のPHPのDOCUMENT_ROOT変数の一貫性のない末尾のスラッシュ


10

異なるサーバー環境では、PHP $_SERVER['DOCUMENT_ROOT']スーパーグローバルに末尾のスラッシュがある場合とない場合があります。この問題は、Apache DocumentRoothttpd.confファイルでどのように定義されているかに直接関係していると思いました。

つまりhttpd.conf、末尾にスラッシュが含まれていない場合、

<VirtualHost *:8880>
    DocumentRoot /var/www/live/current
    ...

次に/ var / www / live / currentecho $_SERVER['DOCUMENT_ROOT']を与える必要があります

httpd.conf末尾にスラッシュが含まれている場合:

<VirtualHost *:8880>
    DocumentRoot /var/www/live/current/
    ...

その後echo $_SERVER['DOCUMENT_ROOT']/ var / www / live / current /

これは、Ubuntu 10.04の場合ですが、RHEL 5.5では$_SERVER['DOCUMENT_ROOT']、Apacheでスラッシュが定義されていなくても、末尾にスラッシュが追加されます。

なぜこれが起こるのか?欠落している構成パラメーターはありますか?


参考のために:

  • RHELのPHP 5.3.3(問題が発生):PHP 5.3.3(cli)(作成日:2010年7月23日16:26:53)
  • UbuntuのPHPバージョン(問題なし):Suhosin-Patchを使用したPHP 5.3.2-1ubuntu4.2(cli)(ビルド:2010年5月13日20:03:45)

回答:


6

スラッシュが仮想ホスト間で変化している理由がわかりません。ところで、それは重要ですか?プログラムに新しいスラッシュを追加するだけで(二重スラッシュが存在する場合は削除してください)、問題は解決します。

私が使う

$realpath = realpath ($_SERVER['DOCUMENT_ROOT']."/");
$realpath = str_replace ("//", "/", $realpath);

4
あなたは単に使用できます$realpath = realpath($_SERVER['DOCUMENT_ROOT']);。複数のスラッシュと後続のスラッシュも自動的に削除されます。常にスラッシュが必要な場合は、上記のへの呼び出しの結果にスラッシュを連結しrealpath()ます。その中ではありません。
インフルエンザ

1
Hosteuropeホスト(Ubuntuだと思います)と同じ問題(php 5.5)を確認できます:スラッシュあり...とWindows 7:スラッシュなし(かなり最近のXAMPPインストール)
Frank Nocke

rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'realpathが実行できるすべての処理よりも少し速いはずです。
フランクノッケ


3

Apache環境のドキュメントルートは、複数の場所で定義できます。

はい、httpd.confこれらの設定が含まれていますが、このファイルはデフォルト構成に使用されるため、上書きすることができます。

vhosts.dsites-availableディレクトリの下のvhost設定を確認することをお勧めします。


2

提案されたソリューション:

$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'])."/";

アザミ


1
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'realpathが実行できるすべての処理よりも少し速いはずです。
Frank Nocke

2

Domの答えはこの問題の解決策ですが、異なる環境で二重の「//」が発生している理由はstefanvescaのステートメントです。ローカルマシンで、仮想ホストを設定した.confファイル内で、定義されたドキュメントルートの最後に/を追加した可能性がありますが、他の環境を設定した人が追加しなかったか、またはその逆です。

いずれにせよ、phpの$ _SERVER ['DOCUMENT_ROOT']を使用すると、構成の結果であるapache環境値が取得されます。これが、ある環境では「/」、別の環境では「//」の理由です。


1

DOCUMENT_ROOTに後続のスラッシュがないと想定しています。

この値はWebサーバー構成から渡されます

アパッチ

DocumentRoot /var/www/html

これは、追加するパスの先頭にスラッシュが必要であることを意味します。

パスの任意の場所にダブルスラッシュ「//」が存在しないことがわかっている(ファイルシステムに関連する場合、httpのURLで、いくつかの不具合がある場合があります)

$ cat /etc//issue Debian GNU/Linux 9 \n \l

DOCUMENT_ROOTの末尾にスラッシュがある場合は、sysadminに結果がないもののせいにすることができます:)

そして、それを安全に無視しますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.