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 DocumentRoot
Definition des Apache in der httpd.conf
Datei steht:
dh ich hätte gedacht, wenn es httpd.conf
keinen 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.conf
es 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)
$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 vonrealpath()
. Nicht drin.rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'
sollte etwas schneller sein als all diese Dinge, die realpath tun kann.http://httpd.apache.org/docs/2.0/mod/core.html sagt: Der DocumentRoot sollte ohne einen abschließenden Schrägstrich angegeben werden.
quelle
Der Dokumentenstamm in einer Apache-Umgebung kann an mehreren Stellen definiert werden.
Ja,
httpd.conf
enthä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.d
undsites-available
Verzeichnisse überprüfen .quelle
Die vorgeschlagene Lösung:
funktioniert nicht in allen Installationen.
Zum Beispiel in meinem Fall:
Gleiches Problem wie zuvor.
Möglicherweise sollten Sie die erste Anweisung ändern in:
Distel
quelle
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'
sollte etwas schneller sein als all diese Dinge, die realpath tun kann.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.
quelle
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?
quelle