A volte $_SERVER['DOCUMENT_ROOT']
restituisce una barra finale. In altri ambienti no. Dove può essere specificato?
risposta
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.
grazie mille per l'informazione, ho usato 'Real_Path' per risolvere lo stesso problema – Hitesh
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.
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.
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');
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)
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
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.
- 1. Problema trailing slash
- 2. url trailing slash e seo
- 3. Mod-rewrite Trailing Slash Numero
- 4. Rimuovere Trailing Slash dall'URL di Magento
- 5. .htaccess espressione regolare bisogno di fare trailing slash opzionale
- 6. PHP $ _SERVER ['REMOTE_ADDR'] vuoto
- 7. PHP $ GLOBALS mancante $ _SERVER
- 8. Che cos'è php $ _SERVER ['REDIRECT_STATUS']?
- 9. PHP $ _SERVER ['REMOTE_ADDR'] mostra IPv6
- 10. Perché $ _SERVER ["PHP_AUTH_USER"] e $ _SERVER ["PHP_AUTH_PW"] non sono impostati?
- 11. Impostazione di un valore $ _SERVER php ($ _SERVER ['something']) utilizzando Apache .htaccess
- 12. $ _SERVER ['HTTP_HOST'] non impostato
- 13. Ignora slash con Apache Rewrite
- 14. cos'è Python equivalente a PHP $ _SERVER?
- 15. Tutti i browser supportano PHP $ _SERVER ['HTTP_X_REQUESTED_WITH']?
- 16. Qual è l'equivalente Perl di PHP $ _SERVER [...]?
- 17. nginx e barre finali in $ document_root?
- 18. $ _SERVER ['PHP_AUTH_USER'] è vuoto
- 19. prova catch in PHP dove il file non carica
- 20. Cron Job $ _SERVER issue
- 21. json_encode() in fuga slash
- 22. di $ _SERVER vars?
- 23. Come posso controllare DOCUMENT_ROOT per funzionare su localhost e live server?
- 24. apache_request_headers() versus $ _SERVER
- 25. Document Server Root in PHP
- 26. trailing problema virgola, javascript
- 27. Trailing Array Idiom
- 28. MySQL Remove Trailing Zero
- 29. Taglia un trailing .0
- 30. Alternativa per $ _SERVER ['HTTP_REFERER'] Variabile PHP in MSIE
Non sicuro che * possa * essere specificato. Quali server sono in esecuzione nei diversi ambienti? –
'$ _SERVER ['DOCUMENT_ROOT'] = sprintf ('% s /', rtrim ($ _ SERVER ['DOCUMENT_ROOT'], '/'));' –
@AlixAxel Non sarebbe che rtrim potrebbe anche ritagliare gli spazi bianchi? Cosa succede se la radice del documento ha spazi bianchi? – CMCDragonkai