En términos generales, hay dos problemas diferentes para resolver cuando se trata de rutas:
- Rutas del sistema de archivos (que debe usar para
incluye
un archivo) - Rutas de URL (que debe usar al crear una URL interna para su aplicación)
Estas son dos bestias diferentes.
Rutas del sistema de archivos
Si su aplicación tiene un solo punto de entrada (por ejemplo, un index.php
que luego delega a la lógica de negocios apropiada después de inspeccionar la cadena de consulta de la URL), entonces puede hacer
$ ROOT_DIR = dirname (__ FILE __);
dentro de ese archivo, y luego puede componer las rutas del sistema de archivos para cualquier archivo en su distribución agregando $ ROOT_DIR
.
Si su aplicación no tiene un solo punto de entrada, entonces esta opción no está disponible y tiene estas alternativas:
- Use rutas relativas en todas partes (esto es lo que le gustaría evitar).
-
Llame a una función de "resolución de ruta" de su script de entrada actual, pasando la ruta relativa del script al directorio base como un parámetro, por ejemplo:
// para un script en $ ROOT_DIR. & # 39; / comandos & # 39; haz esto:
$ ROOT_DIR = resolver_root (__ FILE__, DIRECTORY_SEPARATOR. & # 39; comandos & # 39;);
La información adicional sobre la ruta relativa permitirá que la raíz de
resolucion_root ($ nombre de archivo, $ relativa)
determine qué parte dedirname ($ nombre de archivo)
es la raíz de la aplicación. Sin embargo, la técnica es difícil de administrar y requiere que codifique nombres de rutas relativas dentro de cada punto de entrada de la aplicación, por lo que recomendaría no usarla nunca. -
Requiera que la configuración de su aplicación incluya una variable codificada con la ruta "raíz", similar a
$ ROOT_DIR
anterior. Si su aplicación tiene un instalador, durante la instalación puede hacer que resuelva la ruta raíz con precisión haciendo algo como:
$ installer_dir = dirname (__ FILE__); // Supongamos que esta es la ruta raíz + "/ install" $ ROOT_DIR = realpath ($ installer_dir.DIRECTORY_SEPARATOR. & # 39; .. & # 39;);
El instalador escribiría esta ruta en la configuración de su aplicación. Si su aplicación no tiene un instalador, entonces necesita codificar la ruta base a su configuración manualmente o usar otra opción.
El uso de $ _ SERVER ['DOCUMENT_ROOT']
no es una solución satisfactoria para este problema. Hace el trabajo solo si su aplicación está instalada en la raíz del documento . Si la raíz de su documento es / var / www
y su aplicación está instalada en / var / www / app
no tiene manera de saber qué agregar / app
a las rutas.
Actualización: con con respecto a la respuesta que menciona la ejecución de pwd
en Linux: no haga eso. Siempre. Invocar el shell del sistema para cada solicitud HTTP matará su servidor web más rápido de lo que sus usuarios pueden hacer clic en sus enlaces. Podría funcionar para una aplicación interna que tiene un número pequeño de usuarios conocidos y no tiene expectativas reales de rendimiento, pero ¿por qué no simplemente cifrar esa ruta si está bien con una solución rápida y sucia?
Rutas de URL
Dentro de cualquier aplicación real, también debe crear URL relacionadas con la URL base de su aplicación (por ejemplo, hacer ).
Nuevamente, si su aplicación tiene un solo punto de entrada (por ejemplo, index.php
), puede usar $ _ SERVER ['REQUEST_URI']
para resolver la URL "básica" de su solicitud . Una implementación simple (que debería funcionar bien para usted) es simple: es la parte de la ruta URL que aparece antes de index.php
. Sin embargo, una implementación a prueba de balas que resuelva las peculiaridades de los diferentes servidores web y la configuración de PHP es algo más complicada.
Si su aplicación no tiene un solo punto de entrada, entonces tiene el mismo problema que con las rutas del sistema de archivos. La solución también es la misma: codifique la URL en su configuración manualmente, haga que el instalador la codifique durante la instalación o resuélvala utilizando el conocimiento codificado de sus rutas relativas según sea necesario.
Incluye trabajo a través del sistema de archivos o http.
si usa include /some/file.php PHP se ve en la raíz del servidor.
Puedes usar
incluye $ _SERVER ['DOCUMENT_ROOT']. & # 39; /some/file.php' ;;
o tal vez cambie open_basedir en php.ini (o.htaccess). es decir, open_basedir = / some / where / para usar el directorio raíz /file.php de ESE en lugar de la raíz del servidor o la raíz del documento. También puede ver la sección "rutas y directorios" en php.ini
Utilizo rutas absolutas, pero también comienzo cualquier proyecto PHP personalizado con un archivo de rutina de carga donde defino las rutas que se usan más comúnmente como constantes, basadas en valores Extraído de $ _SERVER
.
Así es como defino mis rutas raíz:
define ("LOCAL_PATH_ROOT", $ _SERVER ["DOCUMENT_ROOT"]); define ("HTTP_PATH_ROOT", isset ($ _ SERVER ["HTTP_HOST"])? $ _SERVER ["HTTP_HOST"]: (isset ($ _ SERVER ["SERVER_NAME"])? $ _SERVER ["SERVER_NAME"]: & # 39; _UNKNOWN _ & # 39;)) ;
La ruta ] LOCAL_PATH_ROOT
es la raíz del documento. La ruta HTTP_PATH_ROOT
es el equivalente cuando se accede a la misma ruta a través de HTTP.
En ese momento, la conversión de cualquier ruta local a una ruta HTTP se puede realizar con el siguiente código:
str_replace (LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, $ my_path)
Si desea garantizar la compatibilidad con servidores basados en Windows, también debes reemplazar el separador de directorios con un separador de URL:
str_replace (LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, str_replace (DIRECTORY_SEPARATOR, & # 39; / & # 39 ;, my mypath))
Aquí está el código de inicio completo Estoy usando para la plantilla de PHP PowerTools:
definido (& # 39; LOCAL_PATH_BOOTSTRAP & # 39;) || define ("LOCAL_PATH_BOOTSTRAP", __DIR__); // ------------------------------------------------ ----------------------- // DEFINIR ALIAS DEL SEPERADOR // //------------------ -------------------------------------------------- - define ("URL_SEPARATOR", & # 39; / & # 39;); define ("DS", DIRECTORY_SEPARATOR); define ("PS", PATH_SEPARATOR); define ("US", URL_SEPARATOR); // ------------------------------------------------ ----------------------- // DEFINIR LAS RAÍCES DE RAÍZ // // -------------------- -------------------------------------------------- - define ("RELATIVE_PATH_ROOT", & # 39; & # 39;); define ("LOCAL_PATH_ROOT", $ _SERVER ["DOCUMENT_ROOT"]); define ("HTTP_PATH_ROOT", isset ($ _ SERVER ["HTTP_HOST"])? $ _SERVER ["HTTP_HOST"]: (isset ($ _ SERVER ["SERVER_NAME"])? $ _SERVER ["SERVER_NAME"]: & # 39; _UNKNOWN _ & # 39;)); // ------------------------------------------------ ----------------------- // DEFINIR LOS CAMINOS RELATIVOS // -------------------- -------------------------------------------------- - define ("RELATIVE_PATH_BASE", str_replace (LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, getcwd ())); define ("RELATIVE_PATH_APP", dirname (RELATIVE_PATH_BASE)); define ("RELATIVE_PATH_LIBRARY", RELATIVE_PATH_APP. DS. & # 39; vendor & # 39;); define ("RELATIVE_PATH_HELPERS", RELATIVE_PATH_BASE); define ("RELATIVE_PATH_TEMPLATE", RELATIVE_PATH_BASE .DS. & # 39; templates & # 39;); define ("RELATIVE_PATH_CONFIG", RELATIVE_PATH_BASE, DS. & # 39; config & # 39;); define ("RELATIVE_PATH_PAGES", RELATIVE_PATH_BASE, DS. & # 39; pages & # 39;); define ("RELATIVE_PATH_ASSET", RELATIVE_PATH_BASE, DS. & # 39; asset & # 39;); define ("RELATIVE_PATH_ASSET_IMG", RELATIVE_PATH_ASSET, DS. & # 39; img & # 39;); define ("RELATIVE_PATH_ASSET_CSS", RELATIVE_PATH_ASSET .DS. & # 39; css & # 39;); define ("RELATIVE_PATH_ASSET_JS", RELATIVE_PATH_ASSET .DS. & # 39; js & # 39;); // ------------------------------------------------ ----------------------- // DEFINIR LOS CAMINOS LOCALES // -------------------- -------------------------------------------------- - define ("LOCAL_PATH_BASE", LOCAL_PATH_ROOT. RELATIVE_PATH_BASE); define ("LOCAL_PATH_APP", LOCAL_PATH_ROOT. RELATIVE_PATH_APP); define ("LOCAL_PATH_LIBRARY", LOCAL_PATH_ROOT. RELATIVE_PATH_LIBRARY); define ("LOCAL_PATH_HELPERS", LOCAL_PATH_ROOT. RELATIVE_PATH_HELPERS); define ("LOCAL_PATH_TEMPLATE", LOCAL_PATH_ROOT. RELATIVE_PATH_TEMPLATE); define ("LOCAL_PATH_CONFIG", LOCAL_PATH_ROOT. RELATIVE_PATH_CONFIG); define ("LOCAL_PATH_PAGES", LOCAL_PATH_ROOT. RELATIVE_PATH_PAGES); define ("LOCAL_PATH_ASSET", LOCAL_PATH_ROOT. RELATIVE_PATH_ASSET); define ("LOCAL_PATH_ASSET_IMG", LOCAL_PATH_ROOT. RELATIVE_PATH_ASSET_IMG); define ("LOCAL_PATH_ASSET_CSS", LOCAL_PATH_ROOT. RELATIVE_PATH_ASSET_CSS); define ("LOCAL_PATH_ASSET_JS", LOCAL_PATH_ROOT. RELATIVE_PATH_ASSET_JS); // ------------------------------------------------ ----------------------- // DEFINIR LOS CAMINOS DE URL // -------------------- -------------------------------------------------- - si (US === DS) {// necesario para la compatibilidad con Windows define ("HTTP_PATH_BASE", HTTP_PATH_ROOT. RELATIVE_PATH_BASE); define ("HTTP_PATH_APP", HTTP_PATH_ROOT. RELATIVE_PATH_APP); define ("HTTP_PATH_LIBRARY", falso); define ("HTTP_PATH_HELPERS", falso); define ("HTTP_PATH_TEMPLATE", falso); define ("HTTP_PATH_CONFIG", falso); define ("HTTP_PATH_PAGES", falso); define ("HTTP_PATH_ASSET", HTTP_PATH_ROOT. RELATIVE_PATH_ASSET); define ("HTTP_PATH_ASSET_IMG", HTTP_PATH_ROOT. RELATIVE_PATH_ASSET_IMG); define ("HTTP_PATH_ASSET_CSS", HTTP_PATH_ROOT. RELATIVE_PATH_ASSET_CSS); define ("HTTP_PATH_ASSET_JS", HTTP_PATH_ROOT. RELATIVE_PATH_ASSET_JS); } else {define ("HTTP_PATH_BASE", HTTP_PATH_ROOT. str_replace (DS, US, RELATIVE_PATH_BASE)); define ("HTTP_PATH_APP", HTTP_PATH_ROOT. str_replace (DS, US, RELATIVE_PATH_APP)); define ("HTTP_PATH_LIBRARY", falso); define ("HTTP_PATH_HELPERS", falso); define ("HTTP_PATH_TEMPLATE", falso); define ("HTTP_PATH_CONFIG", falso); define ("HTTP_PATH_PAGES", falso); define ("HTTP_PATH_ASSET", HTTP_PATH_ROOT. str_replace (DS, US, RELATIVE_PATH_ASSET)); define ("HTTP_PATH_ASSET_IMG", HTTP_PATH_ROOT. str_replace (DS, US, RELATIVE_PATH_ASSET_IMG)); define ("HTTP_PATH_ASSET_CSS", HTTP_PATH_ROOT. str_replace (DS, US, RELATIVE_PATH_ASSET_CSS)); define ("HTTP_PATH_ASSET_JS", HTTP_PATH_ROOT. str_replace (DS, US, RELATIVE_PATH_ASSET_JS)); } // ----------------------------------------------- ------------------------ // DEFINIR LOS PARÁMETROS DE SOLICITUD // ------------------- -------------------------------------------------- - define ("REQUEST_QUERY", isset ($ _ SERVER ["QUERY_STRING"]) && $ _SERVER ["QUERY_STRING"]! = & # 39; & # 39 ;? $ _SERVER ["QUERY_STRING"]: false); define ("REQUEST_METHOD", isset ($ _ SERVER ["REQUEST_METHOD"])? strtoupper ($ _ SERVER ["REQUEST_METHOD"]): false); define ("REQUEST_STATUS", isset ($ _ SERVER ["REDIRECT_STATUS"])? $ _SERVER ["REDIRECT_STATUS"]: false); define ("REQUEST_PROTOCOL", isset ($ _ SERVER ["HTTP_ORIGIN"])? substr ($ _ SERVER ["HTTP_ORIGIN"] 0, strpos ($ _ SERVER ["HTTP_ORIGIN"] & # 39 ;: // & # 39;) + 3): & # 39; http: // & # 39;); define ("REQUEST_PATH", isset ($ _ SERVER ["REQUEST_URI"])? str_replace (RELATIVE_PATH_BASE, & # 39; & # 39 ;, $ _SERVER ["REQUEST_URI"]): & # 39; _UNKNOWN _ & # 39;); define ("REQUEST_PATH_STRIP_QUERY", REQUEST_QUERY? str_replace (& # 39;? & # 39 ;. REQUEST_QUERY, & # 39; & # 39 ;, REQUEST_PATH): REQUEST_PATH); // ------------------------------------------------ ----------------------- // DEFINIR PARÁMETROS DEL SITIO // -------------------- -------------------------------------------------- - definir ("PRODUCCION", falso); define ("PAGE_PATH_DEFAULT", EE. UU. & # 39; index & # 39;); define ("PAGE_PATH", (REQUEST_PATH_STRIP_QUERY === US)? PAGE_PATH_DEFAULT: REQUEST_PATH_STRIP_QUERY);
Si agrega el código anterior a su propio proyecto, la salida de todas las constantes de usuario en este punto (lo que se puede hacer con get_defined_constants (true)
debería dar un resultado como este: [19659007] matriz (& # 39; LOCAL_PATH_BOOTSTRAP & # 39; => & # 39; / var / www /raries / backend / Data / examples & # 39 ;, & # 39; URL_SEPARATOR & # 39; => & # 39; / & # 39 ;, & # 39; DS & # 39; => & # 39; / & # 39 ;, & # 39; PS & # 39; => & # 39 ;, & # 39 ;, & # 39; EE. UU. & # 39 ; => & # 39; / & # 39 ;, & # 39; RELATIVE_PATH_ROOT & # 39; => & # 39; & # 39 ;, & # 39; LOCAL_PATH_ROOT & # 39; => & # 39; / var / www & # 39;, & # 39; HTTP_PATH_ROP & # 39; => & # 39; localhost: 8888 & # 39 ;, & # 39; RELATIVE_PATH_BASE & # 39; => & # 39; / library / backend / Data / examples & # 39; , & # 39; RELATIVE_PATH_APP & # 39; => & # 39; / library / backend / Data & # 39;, & # 39; RELATIVE_PATH_LIBRARY & # 39; => & # 39; /raries / backend / Data / vendor & # 39;, & # 39; RELATIVE_PATH_HELPERS & # 39; => & # 39; /raries / backend / Data / examples & # 39;, & # 39; RELATIVE_PATH_TEMPLATE & # 39; => & # 39; /raries / backe nd / Data / examples / templates & # 39; y & # 39; RELATIVE_PATH_CONFIG & # 39; => & # 39; / library / backend / Data / examples / config & # 39; y & # 39; RELATIVE_PATH_PAGES & # 39; => & # 39; / library / backend / Data / examples / pages & # 39 ;, & # 39; RELATIVE_PATH_ASSET & # 39; => & # 39; / library / backend / Data / examples / asset & # 39;, & # 39; RELATIVE_PATH_ASSET_IMG & # 39; => & # 39; / library / backend / Data / examples / asset / img & # 39; y & # 39; RELATIVE_PATH_ASSET_CSS & # 39; => & # 39; / library / backend / Data / examples / asset / css & # 39;, & # 39; RELATIVE_PATH_ASSET_JS & # 39; => & # 39; / library / backend / Data / examples / asset / js & # 39; y & # 39; LOCAL_PATH_BASE & # 39; => & # 39; / var / www /raries / backend / Data / examples & # 39 ;, & # 39; LOCAL_PATH_APP & # 39; => & # 39; / var / www /raries / backend / Data & # 39 ;, & # 39; LOCAL_PATH_LIBRARY & # 39; => & # 39; / var / www /raries / backend / Data / vendor & # 39 ;, & # 39; LOCAL_PATH_HELPERS & # 39; => & # 39; / var / www /raries / backend / Data / examples & # 39;, & # 39; LOCAL_PATH_TEMPLATE & # 39; => & # 39; / var / www /raries / backend / Data / examples / templates & # 39 ;, & # 39; LOCAL_PATH_CONFIG & # 39; => & # 39; / var / www /raries / backend / Data / examples / config & # 39;, & # 39; LOCAL_PATH_PAGES & # 39; => & # 39; / var / www /raries / backend / Data / examples / pages & # 39; y & # 39; LOCAL_PATH_ASSET & # 39; => & # 39; / var / www /raries / backend / Data / examples / asset & # 39;, & # 39; LOCAL_PATH_ASSET_IMG & # 39; => & # 39; / var / www /raries / backend / Data / examples / asset / img & # 39;, & # 39; LOCAL_PATH_ASSET_CSS & # 39; => & # 39; / var / w ww /raries / backend / Data / examples / asset / css & # 39;, & # 39; LOCAL_PATH_ASSET_JS & # 39; => & # 39; / var / www /raries / backend / Data / examples / asset / js & # 39;, & # 39; HTTP_PATH_BASE & # 39; => & # 39; localhost: 8888 /raries / backend / Data / examples & # 39 ;, & # 39; HTTP_PATH_APP & # 39; => & # 39; localhost: 8888 /raries / backend / Data & # 39 ;, & # 39; HTTP_PATH_LIBRARY & # 39; => falso, & # 39; HTTP_PATH_HELPERS & # 39; => falso, & # 39; HTTP_PATH_TEMPLATE & # 39; => falso, & # 39; HTTP_PATH_CONFIG & # 39; => falso, & # 39; HTTP_PATH_PAGES & # 39; => falso, & # 39; HTTP_PATH_ASSET & # 39; => & # 39; localhost: 8888 / library / backend / Data / examples / asset & # 39;, & # 39; HTTP_PATH_ASSET_IMG & # 39; => & # 39; localhost: 8888 /raries / backend / Data / examples / asset / img & # 39;, & # 39; HTTP_PATH_ASSET_CSS & # 39; => & # 39; localhost: 8888 / library / backend / Data / examples / asset / css & # 39 ;, & # 39; HTTP_PATH_ASSET_JS & # 39; => & # 39; localhost: 8888 / library / backend / Data / examples / asset / js & # 39 ;, & # 39; REQUEST_QUERY & # 39; => falso, & # 39; REQUEST_METHOD & # 39; => & # 39; GET & # 39 ;, & # 39; REQUEST_STATUS & # 39; => falso, & # 39; REQUEST_PROTOCOL & # 39; => & # 39; http: // & # 39 ;, & # 39; REQUEST_PATH & # 39; => & # 39; / & # 39 ;, & # 39; REQUEST_PATH_STRIP_QUERY & # 39; => & # 39; / & # 39;, & # 39; PRODUCCIÓN & # 39; => falso, & # 39; PAGE_PATH_DEFAULT & # 39; => & # 39; / index & # 39;, & # 39; PAGE_PATH & # 39; => & # 39; / index & # 39 ;,) [19659044]
No comments:
Post a Comment