server_software - php http referer
PHP_SELF frente a PATH_INFO frente a SCRIPT_NAME frente a REQUEST_URI (8)
Rutas PHP
$_SERVER[''REQUEST_URI'']
= $_SERVER[''REQUEST_URI'']
web, URI solicitado
$_SERVER[''PHP_SELF'']
= $_SERVER[''PHP_SELF'']
web, archivo solicitado + información de ruta
$_SERVER[''SCRIPT_NAME'']
= $_SERVER[''SCRIPT_NAME'']
web, archivo solicitado
$_SERVER[''SCRIPT_FILENAME'']
= Ruta del archivo, archivo solicitado
__FILE__
= __FILE__
archivo, archivo actual
Dónde
- La ruta del archivo es una ruta de archivo del sistema como
/var/www/index.php
, después de la resolución del alias - La ruta web es una ruta del documento del servidor como
/index.php
desdehttp://foo.com/index.php
, y es posible que ni siquiera coincida con ningún archivo - Archivo actual significa el archivo de script incluido , no cualquier script que lo incluya
- El archivo solicitado significa el archivo de script incluido, no el incluido
- URI es la solicitud HTTP como
/index.php?foo=bar
, antes de cualquier reescritura de URL - La información de ruta es cualquier dato adicional de Apache ubicado después del nombre del script pero antes de la cadena de consulta
Orden de operación
- El cliente envía al servidor una solicitud HTTP
REQUEST_URI
- El servidor realiza cualquier reescritura de URL desde archivos .htaccess, etc. para obtener
PHP_SELF
- El servidor separa
PHP_SELF
enSCRIPT_FILENAME
+PATH_INFO
- El servidor realiza la resolución de alias y convierte la ruta completa de la url en una ruta de archivo del sistema para obtener
SCRIPT_FILENAME
- El archivo de script resultante puede incluir otros, donde
__FILE__
refiere a la ruta al archivo actual
Estoy construyendo una aplicación PHP en CodeIgniter. CodeIgniter envía todas las solicitudes 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, por lo que sabrá 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, simplemente verificaría php_self
, pero en este caso siempre es index.php
. Puedo obtenerlo desde REQUEST_URI
, PATH_INFO
, etc., pero estoy tratando de decidir cuál será más confiable. ¿Alguien sabe (o sabe dónde encontrar) la diferencia real entre PHP_SELF
, PATH_INFO
, SCRIPT_NAME
y REQUEST_URI
? ¡Gracias por tu ayuda!
Nota : He tenido que agregar espacios, ya que SO ve el guión bajo y lo pone en cursiva por algún motivo.
Actualizado : corrigió los espacios.
Algunos ejemplos prácticos de las diferencias entre estas variables:
Ejemplo 1. PHP_SELF es diferente de SCRIPT_NAME solo cuando la URL solicitada está en forma:
http://example.com/test.php/foo/bar
[PHP_SELF] => /test.php/foo/bar
[SCRIPT_NAME] => /test.php
(Este parece ser el único caso cuando 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
[SCRIPT_NAME] => /test.php
[REQUEST_URI] => /test.php?foo=bar
Ejemplo 3. REQUEST_URI es diferente de SCRIPT_NAME cuando la redirección del lado del servidor está en vigor (por ejemplo mod_rewrite en apache):
[REQUEST_URI] => /test.php
[SCRIPT_NAME] => /test2.php
Ejemplo 4. REQUEST_URI es diferente de SCRIPT_NAME cuando se manejan errores HTTP con scripts.
Usando la directiva apache ErrorDocument 404 /404error.php
http://example.com/test.php
[REQUEST_URI] => /test.php
[SCRIPT_NAME] => /404error.php
En el servidor IIS utilizando páginas de error personalizadas
http://example.com/test.php
[SCRIPT_NAME] => /404error.php
[REQUEST_URI] => /404error.php?404;http://example.com/test.php
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:
http://example.com/index.php/news/local/345
La función devolvería esto:
/news/local/345
O puede utilizar los segmentos para profundizar áreas específicas sin tener que generar valores de análisis sintáctico / regex
Hay muy poco para agregar a la respuesta de Odin. Simplemente sentí que debía 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
es
<?php
include ("script_included.php")
?>
donde /var/www/test/php/script_included.php
es
<?php
echo "REQUEST_URI: " . $_SERVER[''REQUEST_URI''] . "<br>";
echo "PHP_SELF: " . $_SERVER[''PHP_SELF''] . "<br>";
echo "QUERY_STRING: " . $_SERVER[''QUERY_STRING''] . "<br>";
echo "SCRIPT_NAME: " . $_SERVER[''SCRIPT_NAME''] . "<br>";
echo "PATH_INFO: " . $_SERVER[''PATH_INFO''] . "<br>";
echo "SCRIPT_FILENAME: " . $_SERVER[''SCRIPT_FILENAME''] . "<br>";
echo "__FILE__ : " . __FILE__ . "<br>";
?>
y /var/www/test/.htaccess
es
RewriteEngine On
RewriteRule before_rewrite/script.php/path/(.*) after_rewrite/script.php/path/$1
y el archivo de configuración de Apache incluye el alias
Alias /test/after_rewrite/ /var/www/test/php/
y la solicitud http es
www.example.com/test/before_rewrite/script.php/path/info?q=helloword
La salida será
REQUEST_URI: /test/before_rewrite/script.php/path/info?q=helloword
PHP_SELF: /test/after_rewrite/script.php/path/info
QUERY_STRING: q=helloword
SCRIPT_NAME: /test/after_rewrite/script.php
PATH_INFO: /path/info
SCRIPT_FILENAME: /var/www/test/php/script.php
__FILE__ : /var/www/test/php/script_included.php
Lo siguiente siempre es válido
PHP_SELF = SCRIPT_NAME + PATH_INFO = full url path between domain and query string.
Si no hay mod_rewrite, mod_dir, ErrorDocument rewrite o cualquier forma de reescritura de URL, también tenemos
REQUEST_URI = PHP_SELF + ? + QUERY_STRING
Los alias afectan a las rutas de archivos del sistema SCRIPT_FILENAME
y __FILE__
, no a las rutas URL, que se definieron anteriormente; consulte las excepciones a continuación. Los alias pueden usar toda la ruta URL, incluido PATH_INFO
. No podría haber ninguna conexión entre SCRIPT_NAME
y SCRIPT_FILENAME
.
No es totalmente exacto que los alias no se resuelven en el momento en que se define la ruta URL [PHP_SELF] = [SCRIPT_NAME] + [PATH_INFO]
, porque se considera que los alias buscan en el sistema de archivos y sabemos por el ejemplo 4 en la respuesta de Odin que El sistema de archivos se busca para determinar si el archivo existe, pero esto solo es relevante cuando el archivo no se encuentra. Del mismo modo, mod_dir llama a mod_alias para buscar en el sistema de archivos, pero esto solo es relevante si tiene un alias como Alias /index.php /var/www/index.php
y la solicitud uri es un directorio.
La documentación de PHP puede decirle la diferencia:
''PHP_SELF''
El nombre del archivo del script que se está ejecutando actualmente, relativo al documento raíz. Por ejemplo, $ _SERVER [''PHP_SELF''] en una secuencia de comandos en la dirección http://example.com/test.php/foo.bar sería /test.php/foo.bar . La constante __FILE__ contiene la ruta completa y el nombre del archivo actual (es decir, incluido). Si PHP se ejecuta como un procesador de línea de comandos, esta variable contiene el nombre del script desde PHP 4.3.0. Anteriormente no estaba disponible.
''SCRIPT_NAME''
Contiene la ruta del script actual. Esto es útil para páginas que necesitan señalarse a sí mismas. La constante __FILE__ contiene la ruta completa y el nombre del archivo actual (es decir, incluido).
''REQUEST_URI''
El URI que se dio para acceder a esta página; por ejemplo, ''/index.html'' .
PATH_INFO no parece estar documentado ...
Personalmente utilizo $REQUEST_URI
ya que hace referencia al URI ingresado y no a la ubicación en el disco del servidor.
Respalde un segundo, ha tomado el enfoque equivocado para comenzar. ¿Por qué no solo hacer esto?
RewriteEngine on
RewriteCond $1 !^(images|inc|favicon/.ico|index/.php|robots/.txt)
RewriteRule ^(.*)$ /index.php?url=$1 [L]
¿en lugar? Luego $_GET[''url''];
con $_GET[''url''];
PATH_INFO
solo está disponible cuando se usa htaccess de esta manera:
Ejemplo 1
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon/.ico|robots/.txt)
RewriteRule ^(.*)$ index.php/$1 [L]
Sigue siendo el mismo
[SCRIPT_NAME] => /index.php
Raíz
[PHP_SELF] => /index.php
[PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script)
[REQUEST_URI] => /
[QUERY_STRING] =>
Camino
[PHP_SELF] => /index.php/test
[PATH_INFO] => /test
[REQUEST_URI] => /test
[QUERY_STRING] =>
Cadena de consulta
[PHP_SELF] => /index.php/test
[PATH_INFO] => /test
[REQUEST_URI] => /test?123
[QUERY_STRING] => 123
Ejemplo 2
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon/.ico|robots/.txt)
RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]
Sigue siendo el mismo
[SCRIPT_NAME] => /index.php
[PHP_SELF] => /index.php
[PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script)
Raíz
[REQUEST_URI] => /
[QUERY_STRING] =>
Camino
[REQUEST_URI] => /test
[QUERY_STRING] => url=test
Cadena de consulta
[REQUEST_URI] => /test?123
[QUERY_STRING] => url=test&123
Ejemplo 3
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon/.ico|robots/.txt)
RewriteRule ^(([a-z]{2})|(([a-z]{2})/)?(.*))$ index.php/$5 [NC,L,E=LANGUAGE:$2$4]
o
RewriteRule ^([a-z]{2})(/(.*))?$ $3 [NC,L,E=LANGUAGE:$1]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon/.ico|robots/.txt)
RewriteRule ^(.*)$ index.php/$1 [L]
Sigue siendo el mismo
[SCRIPT_NAME] => /index.php
Raíz
[PHP_SELF] => /index.php
[PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script)
[REQUEST_URI] => /
[QUERY_STRING] =>
[REDIRECT_LANGUAGE] IS NOT AVAILABLE
Camino
[PHP_SELF] => /index.php/test
[PATH_INFO] => /test
[REQUEST_URI] => /test
[QUERY_STRING] =>
[REDIRECT_LANGUAGE] =>
Idioma
[PHP_SELF] => /index.php/
[PATH_INFO] => /
[REQUEST_URI] => /en
[QUERY_STRING] =>
[REDIRECT_LANGUAGE] => en
Ruta del idioma
[PHP_SELF] => /index.php/test
[PATH_INFO] => /test
[REQUEST_URI] => /en/test
[REDIRECT_LANGUAGE] => en
Cadena de consulta de idioma
[PHP_SELF] => /index.php/test
[PATH_INFO] => /test
[REQUEST_URI] => /en/test?123
[QUERY_STRING] => 123
[REDIRECT_LANGUAGE] => en