W różnych środowiskach serwerowych $_SERVER['DOCUMENT_ROOT']
super globalny PHP czasami ma końcowe ukośniki, a czasem nie. Wydaje mi się, że ten problem jest bezpośrednio związany ze DocumentRoot
zdefiniowaniem Apache w httpd.conf
pliku:
tzn. pomyślałbym, że jeśli httpd.conf
nie zawiera końcowego ukośnika:
<VirtualHost *:8880>
DocumentRoot /var/www/live/current
...
następnie echo $_SERVER['DOCUMENT_ROOT']
powinien dać / var / www / live / current
a jeśli httpd.conf
zawiera ukośnik:
<VirtualHost *:8880>
DocumentRoot /var/www/live/current/
...
następnie echo $_SERVER['DOCUMENT_ROOT']
powinien dać / var / www / live / current /
Tak jest w przypadku Ubuntu 10.04, ale w RHEL 5.5 dodawany jest ukośnik końcowy, $_SERVER['DOCUMENT_ROOT']
nawet jeśli nie został zdefiniowany w Apache.
Wiesz, dlaczego tak się dzieje? Czy brakuje mi parametru konfiguracyjnego?
Na przykład:
- PHP 5.3.3 z RHEL (problem występuje): PHP 5.3.3 (cli) (zbudowany: 23 lipca 2010 16:26:53)
- Ubuntu w wersji PHP (bez problemu): PHP 5.3.2-1ubuntu4.2 z łatką Suhosin (cli) (zbudowany: 13 maja 2010 20:03:45)
$realpath = realpath($_SERVER['DOCUMENT_ROOT']);
. Automatycznie usuwa wszystkie wielokrotne ukośniki, a także końcowy. Jeśli zawsze chcesz końcowego ukośnika połączyć go z wynikiem powyższego wywołania dorealpath()
. Nie w środku.rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'
powinien być nieco szybszy niż wszystkie te rzeczy, które może zrobić prawdziwa ścieżka.http://httpd.apache.org/docs/2.0/mod/core.html mówi: DocumentRoot należy określić bez ukośnika końcowego.
źródło
Katalog główny w środowisku Apache można zdefiniować w więcej niż jednym miejscu.
Tak,
httpd.conf
zawiera te ustawienia, ale można je zastąpić, ponieważ ten plik jest używany do konfiguracji domyślnej.Sugeruję, abyś sprawdził konfigurację vhost pod
vhosts.d
isites-available
katalogami.źródło
Proponowane rozwiązanie:
nie działa we wszystkich instalacjach.
Na przykład w moim przypadku:
Ten sam problem jak poprzednio.
Być może powinieneś zmodyfikować pierwszą instrukcję w:
oset
źródło
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'
powinien być nieco szybszy niż wszystkie te rzeczy, które może zrobić prawdziwa ścieżka.Odpowiedź Dom jest rozwiązaniem tego problemu, jednak wypowiedź Stefanaveski jest przyczyną, dla której w różnych środowiskach występuje podwójne „//”. Na komputerze lokalnym, w pliku .conf, w którym skonfigurowano wirtualnego hosta, najprawdopodobniej dodano / na końcu zdefiniowanego katalogu głównego dokumentu, podczas gdy osoba, która skonfigurowała inne środowisko, nie zrobiła tego lub odwrotnie.
Tak czy inaczej, podczas korzystania z $ _SERVER ['DOCUMENT_ROOT'] php otrzymujesz wartość środowiska apache, która jest wynikiem konfiguracji. To jest powód „/” w jednym środowisku i „//” w innym.
źródło
Powiedziałbym, że założono, że DOCUMENT_ROOT nie ma ukośnika końcowego.
Ta wartość jest przekazywana z konfiguracji serwera WWW
apacz
DocumentRoot /var/www/html
Oznacza to, że powinniśmy mieć wiodący ukośnik do ścieżki, którą do niego dodamy.
Wiedząc, że podwójne ukośnik „//” w dowolnym miejscu na ścieżce nie ma konsekwencji (w przypadku systemu plików ... w adresie URL mogą wystąpić przypadki, w których występują pewne usterki)
$ cat /etc//issue Debian GNU/Linux 9 \n \l
Kiedy pojawia się ukośnik do DOCUMENT_ROOT, możemy winić sysadmin za coś, co nie ma konsekwencji :)
I bezpiecznie to zignorować?
źródło