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.phpen el URI. Por ejemplo, http://www.example.com/faq/whateverse 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_NAMEy 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_INFOsolo 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.phpdesdehttp://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_URIPHP_SELFPHP_SELFenSCRIPT_FILENAME+PATH_INFOSCRIPT_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_URIya 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.phpesdonde
/var/www/test/php/script_included.phpestay
/var/www/test/.htaccessesy 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_FILENAMEy__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_NAMEySCRIPT_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.phpy 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=500fuente
Retrocede un segundo, has tomado el enfoque equivocado para empezar. ¿Por qué no hacer esto?
¿en lugar? Entonces agárralo con
$_GET['url'];fuente
QSAmarca), los parámetros de la cadena de consulta pueden potencialmente sobrescribirse (por ejemplo, si necesita unurlparámetro en la solicitud inicial) o peor aún, ser vulnerable a ataques XSS.