Inkonsistenter abschließender Schrägstrich in der Variablen DOCUMENT_ROOT in PHP bei Verwendung von Apache

10

In verschiedenen Serverumgebungen weist PHP $_SERVER['DOCUMENT_ROOT']Super Global manchmal einen abschließenden Schrägstrich auf und manchmal nicht. Ich hätte gedacht, dass dieses Problem in direktem Zusammenhang mit der DocumentRootDefinition des Apache in der httpd.confDatei steht:

dh ich hätte gedacht, wenn es httpd.confkeinen abschließenden Schrägstrich enthält:

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

dann echo $_SERVER['DOCUMENT_ROOT']sollte / var / www / live / current geben

und wenn httpd.confes einen abschließenden Schrägstrich enthält:

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

dann echo $_SERVER['DOCUMENT_ROOT']sollte / var / www / live / current / geben

Dies ist unter Ubuntu 10.04 der Fall, aber unter RHEL 5.5 wird ein abschließender Schrägstrich hinzugefügt, $_SERVER['DOCUMENT_ROOT']selbst wenn unter Apache keiner definiert wurde.

Irgendeine Idee, warum das passiert? Gibt es einen Konfigurationsparameter, den ich vermisse?


Als Referenz:

  • PHP 5.3.3 von RHEL (Problem tritt auf): PHP 5.3.3 (cli) (erstellt: 23. Juli 2010, 16:26:53 Uhr)
  • PHP-Version von Ubuntu (kein Problem): PHP 5.3.2-1ubuntu4.2 mit Suhosin-Patch (cli) (erstellt: 13. Mai 2010, 20:03:45 Uhr)
Tom
quelle

Antworten:

6

Ich habe keine Ahnung, warum sich der Schrägstrich zwischen Ihren virtuellen Hosts ändert. Ist es übrigens wichtig? Fügen Sie Ihren Programmen einfach einen neuen Schrägstrich hinzu (entfernen Sie ihn, wenn ein doppelter Schrägstrich vorhanden ist), und das Problem ist behoben.

ich benutze

$realpath = realpath ($_SERVER['DOCUMENT_ROOT']."/");
$realpath = str_replace ("//", "/", $realpath);
Dom
quelle
4
Sie könnten einfach verwenden $realpath = realpath($_SERVER['DOCUMENT_ROOT']);. Es werden automatisch alle mehrfachen Schrägstriche und auch der nachfolgende entfernt. Wenn Sie immer einen abschließenden Schrägstrich wünschen, verketten Sie ihn mit dem Ergebnis des obigen Aufrufs von realpath(). Nicht drin.
Grippe
1
Ich kann das gleiche Problem (PHP 5.5) zwischen einem Hosteurope-Host (Ubuntu, glaube ich) bestätigen: hat einen Schrägstrich ... und Windows 7: kein Schrägstrich (ziemlich aktuelle XAMPP-Installation)
Frank Nocke
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'sollte etwas schneller sein als all diese Dinge, die realpath tun kann.
Frank Nocke
3

Der Dokumentenstamm in einer Apache-Umgebung kann an mehreren Stellen definiert werden.

Ja, httpd.confenthält diese Einstellungen, sie können jedoch überschrieben werden, da diese Datei für die Standardkonfiguration verwendet wird.

Ich würde vorschlagen, dass Sie die vhost-Konfiguration unter vhosts.dund sites-availableVerzeichnisse überprüfen .

veidelis
quelle
2

Die vorgeschlagene Lösung:

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

funktioniert nicht in allen Installationen.

Zum Beispiel in meinem Fall:

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

Gleiches Problem wie zuvor.

Möglicherweise sollten Sie die erste Anweisung ändern in:

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

Distel

Antonio
quelle
1
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'sollte etwas schneller sein als all diese Dinge, die realpath tun kann.
Frank Nocke
2

Doms Antwort ist eine Lösung für dieses Problem. Die Aussage von stefanvesca ist jedoch der Grund, warum in den verschiedenen Umgebungen das doppelte '//' auftritt. Auf Ihrem lokalen Computer haben Sie in Ihrer .conf-Datei, in der Sie Ihren virtuellen Host eingerichtet haben, höchstwahrscheinlich das / am Ende des definierten Dokumentstamms hinzugefügt, während die Person, die Ihre andere Umgebung eingerichtet hat, dies nicht getan hat oder umgekehrt.

In beiden Fällen erhalten Sie bei Verwendung von $ _SERVER ['DOCUMENT_ROOT'] von php den Apache-Umgebungswert, der das Ergebnis der Konfiguration ist. Dies ist der Grund für das '/' in einer Umgebung und das '//' in einer anderen.

Ben Smith
quelle
1

Ich würde sagen, es wird angenommen, dass DOCUMENT_ROOT keinen abschließenden Schrägstrich hat.

Dieser Wert wird von der Webserverkonfiguration übergeben

Apache

DocumentRoot /var/www/html

Das bedeutet, dass wir einen führenden Schrägstrich für den Pfad haben sollten, den wir hinzufügen.

Zu wissen, dass ein doppelter Schrägstrich '//' irgendwo im Pfad keine Konsequenz hat (wenn er sich auf das Dateisystem bezieht ... in einer http-URL kann es Fälle geben, in denen es einige Störungen gibt)

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

Wenn DOCUMENT_ROOT einen abschließenden Schrägstrich enthält, können wir sysadmin für etwas verantwortlich machen, das keine Konsequenz hat :)

Und es sicher ignorieren?

Antony Gibbs
quelle