web-dev-qa-db-ja.com

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

別のサーバー環境では、PHP $_SERVER['DOCUMENT_ROOT']スーパーグローバルに末尾にスラッシュが付いている場合と付いていない場合があります。この問題は、Apache DocumentRoothttpd.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']に追加されます。

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


参考のため:

  • RHELのPHP 5.3.3(問題が発生):PHP 5.3.3(cli)(built:Jul 23 2010 16:26:53)
  • UbuntuのPHPバージョン(問題なし):PHP 5.3.2-1ubuntu4.2 with Suhosin-Patch(cli)(built:May 13 2010 20:03:45)
10
Tom

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

私が使う

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

http://httpd.Apache.org/docs/2.0/mod/core.html 言う:DocumentRootは、末尾のスラッシュなしで指定する必要があります。

3
stefanvesca

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

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

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

3
veidelis

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

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

2
Ben Smith

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

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

アザミ

2
antonio

DOCUMENT_ROOTに末尾のスラッシュがないと仮定します。

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

Apache

DocumentRoot /var/www/html

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

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

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

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

安全に無視しますか?

1
Antony Gibbs