Estoy construyendo una aplicación PHP en CodeIgniter. CodeIgniter envía todas las peticiones al controlador principal: index.php
. Sin embargo, no me gusta ver index.php
en el URI. Por ejemplo, http://www.example.com/faq/whatever
se enrutará a http://www.example.com/index.php/faq/whatever
. Necesito una forma confiable para que un script sepa cuál es su dirección, para que sepa qué hacer con la navegación. He usado mod_rewrite
, según la documentación de CodeIgniter.
La regla es la siguiente:
RewriteEngine on
RewriteCond $1 !^(images|inc|favicon\.ico|index\.php|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
Normalmente, lo comprobaría php_self
, pero en este caso siempre es así index.php
. Puedo obtener de REQUEST_URI
, PATH_INFO
, etc, pero estoy tratando de decidir cuál será la más fiable. ¿Alguien sabe (o saber dónde encontrar) la diferencia real entre PHP_SELF
, PATH_INFO
, SCRIPT_NAME
y REQUEST_URI
? ¡Gracias por tu ayuda!
Nota : Tuve que agregar espacios, ya que SO ve el guión bajo y lo pone en cursiva por alguna razón.
Actualizado : Se corrigieron los espacios.
fuente
Algunos ejemplos prácticos de las diferencias entre estas variables:
Ejemplo 1. PHP_SELF es diferente de SCRIPT_NAME solo cuando la URL solicitada tiene el formato:
http://example.com/test.php/foo/bar
(Este parece ser el único caso en el que PATH_INFO contiene información sensible [PATH_INFO] => / foo / bar) Nota: esto solía ser diferente en algunas versiones anteriores de PHP (<= 5.0?).
Ejemplo 2. REQUEST_URI es diferente de SCRIPT_NAME cuando se ingresa una cadena de consulta no vacía:
http://example.com/test.php?foo=bar
Ejemplo 3. REQUEST_URI es diferente de SCRIPT_NAME cuando la redirección del lado del servidor está en efecto (por ejemplo, mod_rewrite en apache):
http://example.com/test.php
Ejemplo 4. REQUEST_URI es diferente de SCRIPT_NAME cuando se manejan errores HTTP con scripts.
Usando la directiva de apache ErrorDocument 404 /404error.php
http://example.com/test.php
En el servidor IIS usando páginas de error personalizadas
http://example.com/test.php
fuente
/
al final delSCRIPT_NAME
. Esto parece ser consistente en PHP 5.2-5.4 entonces, considerando editar la respuesta para reflejar eso.PATH_INFO
solo está disponible cuando se usa htaccess de esta manera:Ejemplo 1
Sigue siendo el mismo
Raíz
http://dominio.com/
Camino
http://domain.com/test
Cadena de consulta
http://domain.com/test?123
Ejemplo 2
Sigue siendo el mismo
Raíz
http://dominio.com/
Camino
http://domain.com/test
Cadena de consulta
http://domain.com/test?123
Ejemplo 3
o
Sigue siendo el mismo
Raíz
http://dominio.com/
Camino
http://domain.com/test
Idioma
http://domain.com/en
Ruta del idioma
http://domain.com/en/test
Cadena de consulta de idioma
http://domain.com/en/test?123
fuente
Rutas PHP
$_SERVER['REQUEST_URI']
= Ruta web, URI solicitada$_SERVER['PHP_SELF']
= Ruta web, archivo solicitado + información de$_SERVER['SCRIPT_NAME']
ruta$_SERVER['SCRIPT_FILENAME']
= Ruta web, archivo solicitado = Ruta de archivo, archivo solicitado__FILE__
= Ruta de archivo, archivo actualDónde
/var/www/index.php
, después de la resolución de alias/index.php
desdehttp://foo.com/index.php
, y puede que ni siquiera coincida con ningún archivo/index.php?foo=bar
, antes de cualquier reescritura de URLOrden de operación
REQUEST_URI
PHP_SELF
PHP_SELF
enSCRIPT_FILENAME
+PATH_INFO
SCRIPT_FILENAME
__FILE__
refiere a la ruta al archivo actualfuente
$_SERVER['SCRIPT_NAME']
y$_SERVER['PHP_SELF']
, debido a que mod_rewrite crea la ruta completa, que es$_SERVER['PHP_SELF']
. La separación ocurre a continuación. Tenga en cuenta que los alias también consideran la ruta completa para definir el nombre del archivo del script, pero la separación que definió el script_name y path_info ya ocurrió, por lo que no se verán afectados.Es posible que desee examinar la clase URI y hacer uso de $ this-> uri-> uri_string ()
Devuelve una cadena con el URI completo.
Por ejemplo, si esta es su URL completa:
La función devolvería esto:
O puede hacer uso de los segmentos para profundizar en áreas específicas sin tener que generar valores de análisis / expresión regular
fuente
Personalmente utilizo el
$REQUEST_URI
ya que hace referencia al URI ingresado y no a la ubicación en el disco del servidor.fuente
Hay muy poco que agregar a la respuesta de Odin. Solo sentí proporcionar un ejemplo completo de la solicitud HTTP al archivo real en el sistema de archivos para ilustrar los efectos de la reescritura de URL y los alias. En el sistema de archivos, el script
/var/www/test/php/script.php
esdonde
/var/www/test/php/script_included.php
estay
/var/www/test/.htaccess
esy el archivo de configuración de Apache incluye el alias
y la solicitud http es
La salida será
Lo siguiente siempre es válido
Si no hay mod_rewrite, mod_dir, ErrorDocument rewrite o cualquier forma de reescritura de URL, también tenemos
Los alias afectan las rutas de los archivos del sistema
SCRIPT_FILENAME
y__FILE__
no las rutas URL, que se definieron anteriormente; consulte las excepciones a continuación. Los alias pueden utilizar toda la ruta de la URL, incluidoPATH_INFO
. No puede haber ninguna conexión entreSCRIPT_NAME
ySCRIPT_FILENAME
.No es totalmente exacto que los alias no se resuelvan en el momento en que
[PHP_SELF] = [SCRIPT_NAME] + [PATH_INFO]
se define la ruta URL , porque se considera que los alias buscan en el sistema de archivos y sabemos por el ejemplo 4 en la respuesta de Odin que se busca en el sistema de archivos para determinar si el archivo existe. pero esto solo es relevante cuando no se encuentra el archivo. De manera similar, mod_dir llama a mod_alias para buscar en el sistema de archivos, pero esto solo es relevante si tiene un alias comoAlias \index.php \var\www\index.php
y la solicitud uri es un directorio.fuente
Si alguna vez olvida qué variables hacen qué, puede escribir un pequeño script que use phpinfo () y llamarlo desde una URL con una cadena de consulta. Dado que las instalaciones de software de servidor presentan las variables que devuelve PHP, siempre es una buena idea comprobar la salida de la máquina en caso de que las reescrituras en el archivo de configuración del servidor provoquen resultados diferentes a los esperados. Guárdelo como algo como
_inf0.php
:Entonces llamarías
/_inf0.php?q=500
fuente
Retrocede un segundo, has tomado el enfoque equivocado para empezar. ¿Por qué no hacer esto?
¿en lugar? Entonces agárralo con
$_GET['url'];
fuente
QSA
marca), los parámetros de la cadena de consulta pueden potencialmente sobrescribirse (por ejemplo, si necesita unurl
parámetro en la solicitud inicial) o peor aún, ser vulnerable a ataques XSS.