2012-03-12 15 views
6

A volte $_SERVER['DOCUMENT_ROOT'] restituisce una barra finale. In altri ambienti no. Dove può essere specificato?

+1

Non sicuro che * possa * essere specificato. Quali server sono in esecuzione nei diversi ambienti? –

+2

'$ _SERVER ['DOCUMENT_ROOT'] = sprintf ('% s /', rtrim ($ _ SERVER ['DOCUMENT_ROOT'], '/'));' –

+0

@AlixAxel Non sarebbe che rtrim potrebbe anche ritagliare gli spazi bianchi? Cosa succede se la radice del documento ha spazi bianchi? – CMCDragonkai

risposta

10

Non è possibile dire in anticipo se $_SERVER['DOCUMENT_ROOT'] contiene una barra alla fine o meno.

Normalmente, se configurato correttamente, lo non contiene una barra finale. Su Ubuntu (così come su UNIX), un percorso scritto correttamente in una directory non ha il / alla fine. Ad esempio, su Windows, Apache si rifiuterà di avviarsi se è configurato con uno. Su UNIX Apache non è così schizzinoso e consente una barra finale.

Ma c'è un'eccezione, se si crea la directory radice (/) la radice del documento. A causa di questo caso, non puoi dire in anticipo se contiene o meno una barra finale.

In ogni caso contiene il valore di DocumentRoot directive - con o senza barra finale come è stato scritto nel file di configurazione httpd. PHP assume solo il valore di Apache. Per ottenere la radice del documento reale, utilizzare e/o aggiungere una barra (o rimuoverla) in modo condizionale alla fine nel file di configurazione o nel codice PHP.

+0

grazie mille per l'informazione, ho usato 'Real_Path' per risolvere lo stesso problema – Hitesh

1

Penso che dipenda dalla configurazione del server se la web root è definita con o senza una barra di coda. Basta controllare che questo sia uguale su tutti i sistemi.

Vedere anche lo ServerRoot-Directive della documentazione di apache.

4

Tendo ad usare la directory corrente più di quanto non utilizzi docroot perché funziona bene anche su riga di comando e nei test di unità. Io tendo ad usare qualcosa di simile:

require_once(dirname(__FILE__).'/../../../../constants.php'); 

Piuttosto che:

require_once($_SERVER['DOCUMENT_ROOT'].'/../constants.php'); 

l'ho visto la prima volta nel sorgente di Wordpress e piuttosto è piaciuto, ma può portare a un sacco di '../' ripetizione .

P.S. FILE è il file corrente e dirname cancellerà il /something.php dalla fine, lasciando quindi il percorso della directory contenente il file corrente.

2

Si può fare in questo modo, al fine di assicurarsi che la barra finale è sempre presente

'/'. Assetto ($ _SERVER [ 'DOCUMENT_ROOT'], '/'). '/'

require_once('/'.trim($_SERVER['DOCUMENT_ROOT'], '/').'/'.'constants.php'); 
0

La risposta di Hakre è quella giusta. Ho provato a utilizzare include in diverse situazioni, in uno script di console o su un server web. La mia migliore scommessa era usare un percorso assoluto, iniziando con DOCUMENT_ROOT. Ma ero ancora bloccato a causa di quel taglio finale. Ecco quello che sembra essere una buona soluzione:

include_once getenv ("DOCUMENT_ROOT") "./ WEB-INF/classes

quindi richiamare lo script con PHP test.php da un. script batch e inserire un valore nella variabile env DOCUMENT_ROOT o meno, con una barra finale o meno. Quando caricato da apache, getenv è già pieno.

Il motore di php può gestire con ././, indicando lo stesso di ./. Allo stesso modo htdocs./ è interpretato ha htdocs/(sotto windows)

0

Vecchia domanda, lo so, ma dal momento che mi ha dato un'idea su come risolvere questo problema per me stesso aggiungerò qui la mia soluzione. Volevo definire una costante (ROOTPATH) con $ _SERVER ['DOCUMENT_ROOT'] e assicurarsi che abbia una barra finale (DIRECTORY_SEPARATOR).

define('ROOTPATH', (ctype_alnum(substr($_SERVER['DOCUMENT_ROOT'], -1)) ? $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR : $_SERVER['DOCUMENT_ROOT'])); 

Questo presuppone l'ultimo carattere del nome della cartella è alfanumerico (non ho potuto ricordo di aver visto molti nomi delle cartelle che finiscono con caratteri speciali). Se si vuole fare in modo non c'è una slash si potrebbe andare con qualcosa di simile:

define('ROOTPATH', (!ctype_alnum(substr($_SERVER['DOCUMENT_ROOT'], -1)) ? substr($_SERVER['DOCUMENT_ROOT'], 0, -1) : $_SERVER['DOCUMENT_ROOT'])); 

Pace, Mo

0

Quando si utilizzano host virtuali, Apache scrive in $_SERVER['DOCUMENT_ROOT'] il valore di DocumentRoot di host virtuale. Quindi puoi scrivere la barra finale lì.

Ma non è una buona decisione perché diversi hosters trattano questo paramenter in modo diverso, quindi la tua applicazione non dovrebbe fare affidamento su di essa e deve determinare la presenza di una barra senza assistenza.