PHP Completa dynamicmente Percorso URL assoluto per file specifici che verranno inclusi in altri file

Ho un file di configuration. Questo non è un file autonomo. Includerò questo file nella parte superiore delle pagine che voglio utilizzare, usando require (). Voglio get in modo dinamico il path URL assoluto completo per questo file di configuration , indipendentemente dalla sua posizione e memorizzarlo come una costante all'interno di se stesso. Per esempio:

Posizione fisica: (root dir) /my_folder/configuration.php

Ho bisogno dell'URL come: www.mydomain.com/my_folder/configuration.php

Posizione fisica: (root dir) /demos/my_folder/configuration.php

Ho bisogno dell'URL come: www.mydomain.com/demos/my_folder/configuration.php

Posizione fisica: (root dir) /demos/site1/my_folder/configuration.php

Ho bisogno dell'URL come: www.mydomain.com/demos/site1/my_folder/configuration.php

Posizione fisica: (directory principale) /demos/site2/my_folder/configuration.php

Ho bisogno dell'URL come: www.mydomain.com/demos/site2/my_folder/configuration.php

Semplice finora? Ecco cosa è veramente necessario e lo rende complicato (IMO). Considera questo:

File di configuration situato su: www.mydomain.com/demos/site2/my_folder/configuration.php

Avere cartelle nidificate: www.mydomain.com/demos/site2/1/2/3/index.php

Quando accedo al file index.php nella sottocartella "3" seguendo l'URL sopra, ho bisogno del path del file di configuration come www.mydomain.com/demos/site2/my_folder/configuration.php e non come www. mydomain.com/demos/site2/1/2/3/my_folder/configuration.php

Come posso get quanto sopra?

Se puoi fare affidamento sul valore di $_SERVER[ 'DOCUMENT_ROOT' ] , quindi all'interno di configuration.php :

 $path = substr( __FILE__, strlen( $_SERVER[ 'DOCUMENT_ROOT' ] ) ); $url = "www.mydomain.com{$path}"; 

Se si adatta al tuo caso d'uso, puoi renderlo più dinamico usando $_SERVER[ 'HTTP_HOST' ] ;

DOCUMENT_ROOT

Ho usato DOCUMENT_ROOT liberamente nel mio sviluppo, poiché spesso è l'unica variabile dynamic disponibile per la costruzione di determinati routes autoreferenziali. C'è un bug bug Apache ( # 26052 ) che parla di come DOCUMENT_ROOT è gestito male, in particolare che Apache non consente di impostare il valore con RewriteRule e non lo ha impostato su un valore ragionevole quando si utilizza mod_vhost_alias. La discussione prosegue per un periodo di 7-8 anni poiché le persone presumibilmente dal progetto Apache resistono al cambiamento del comportmento, fino a quando alla fine sono arrivati ​​e hanno apportto una modifica quest'anno nel 2.4.1. (L'ho esaminato in precedenza, ma ora dimentico quali sono stati i cambiamenti esatti e quanto sono soddisfacenti.)

Se guardi i commenti sul ticket, vedrai persone che resistono a modifiche del comportmento con commenti come:

Non fidarti della variabile DOCUMENT_ROOT.

DOCUMENT_ROOT non è, non è mai stato, e non sarà mai un modo affidabile per trovare il path del file system per il contenuto web.

Quindi suggerisco di leggere i commenti su quel biglietto per vedere quali persone stanno dicendo che i caveat di usarlo sono. L'ho usato con molto successo e non conosco un modo migliore per get le stesse cose nelle stesse situazioni in cui DOCUMENT_ROOT è disponibile e fornisce i dati necessari.

Quello che ho usato, che ha funzionato perfettamente per quello che volevo, era questo:

 define('URL', dirname(substr($_SERVER['SCRIPT_FILENAME'], strlen( $_SERVER[ 'DOCUMENT_ROOT' ] ) )).'/');