Barra obliqua incoerente nella variabile DOCUMENT_ROOT in PHP quando si utilizza Apache


10

In diversi ambienti server, il PHP $_SERVER['DOCUMENT_ROOT']super global a volte ha una barra finale e talvolta no. Avrei pensato che questo problema fosse direttamente correlato al modo in cui Apache DocumentRootè definito nel httpd.conffile:

cioè avrei pensato che se httpd.confnon contiene una barra finale:

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

allora echo $_SERVER['DOCUMENT_ROOT']dovrebbe dare / var / www / live / current

e se httpd.confcontiene una barra finale:

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

allora echo $_SERVER['DOCUMENT_ROOT']dovrebbe dare / var / www / live / current /

Questo è il caso di Ubuntu 10.04 ma su RHEL 5.5 viene aggiunta una barra finale $_SERVER['DOCUMENT_ROOT']anche se nessuna è stata definita su Apache.

Qualche idea del perché accada questo? C'è un parametro di configurazione che mi manca?


Per riferimento:

  • PHP 5.3.3 di RHEL (il problema si verifica): PHP 5.3.3 (cli) (costruito: 23 lug 2010 16:26:53)
  • Versione PHP di Ubuntu (nessun problema): PHP 5.3.2-1ubuntu4.2 con Suhosin-Patch (cli) (costruito: 13 maggio 2010 20:03:45)

Risposte:


6

Non ho idea del perché la barra stia cambiando tra i tuoi host virtuali. A proposito, è importante? Aggiungi una nuova barra ai tuoi programmi (rimuovi se è presente una doppia barra) e il problema è risolto.

Io uso

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

4
Potresti semplicemente usare $realpath = realpath($_SERVER['DOCUMENT_ROOT']);. Rimuove automaticamente tutte le barre multiple e anche quella finale. Se si desidera sempre una barra finale concatenarla al risultato della chiamata precedente realpath(). Non al suo interno.
influenza

1
Posso confermare lo stesso problema (php 5.5) tra un host Hosteurope (credo Ubuntu): ha barra ... e Windows 7: nessuna barra (installazione XAMPP abbastanza recente)
Frank Nocke,

rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'dovrebbe essere leggermente più veloce di tutte quelle cose che realpath può fare.
Frank Nocke,


3

La radice del documento in un ambiente Apache può essere definita in più di un posto.

Sì, httpd.confcontiene queste impostazioni, ma possono essere sovrascritte poiché questo file viene utilizzato per la configurazione predefinita.

Ti suggerisco di andare a controllare la configurazione del vhost in vhosts.de le sites-availabledirectory.


2

La soluzione proposta:

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

non funziona in tutte le installazioni.

Ad esempio, nel mio caso:

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

Stesso problema di prima.

Potrebbe essere necessario modificare la prima istruzione in:

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

cardo


1
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'dovrebbe essere leggermente più veloce di tutte quelle cose che realpath può fare.
Frank Nocke,

2

La risposta di Dom è una soluzione a questo problema, tuttavia l'affermazione di stefanvesca è il motivo per cui nei diversi ambienti si sta verificando il doppio "//". Sul tuo computer locale, all'interno del tuo file .conf in cui hai impostato il tuo host virtuale, molto probabilmente hai aggiunto / alla fine della radice del documento definita, mentre la persona che ha impostato il tuo altro ambiente no, o viceversa.

Ad ogni modo, quando si utilizza $ _SERVER ['DOCUMENT_ROOT'] di php si ottiene il valore dell'ambiente apache che è il risultato della configurazione. Questa è la ragione per "/" in un ambiente e "//" in un altro.


1

Direi che si presume che DOCUMENT_ROOT non abbia una barra finale.

Questo valore viene passato dalla configurazione del server Web

apache

DocumentRoot /var/www/html

Ciò implica che dovremmo avere una barra che porta al percorso che aggiungiamo ad esso.

Sapendo che una doppia barra "//" in qualsiasi punto del percorso non ha conseguenze (se correlata al filesystem ... in un URL http, potrebbero esserci casi in cui si riscontrano dei problemi)

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

Quando c'è una barra finale a DOCUMENT_ROOT, possiamo incolpare l'amministratore di sistema su qualcosa che non ha conseguenze :)

E ignorarlo in sicurezza?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.