w3schools server_software server_addr remote_addr query_string php_self http_user_agent _server http php codeigniter

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 desde http://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

  1. El cliente envía al servidor una solicitud HTTP REQUEST_URI
  2. El servidor realiza cualquier reescritura de URL desde archivos .htaccess, etc. para obtener PHP_SELF
  3. El servidor separa PHP_SELF en SCRIPT_FILENAME + PATH_INFO
  4. 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
  5. 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):

http://example.com/test.php

[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

http://domain.com/

[PHP_SELF] => /index.php [PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script) [REQUEST_URI] => / [QUERY_STRING] =>

Camino

http://domain.com/test

[PHP_SELF] => /index.php/test [PATH_INFO] => /test [REQUEST_URI] => /test [QUERY_STRING] =>

Cadena de consulta

http://domain.com/test?123

[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

http://domain.com/

[REQUEST_URI] => / [QUERY_STRING] =>

Camino

http://domain.com/test

[REQUEST_URI] => /test [QUERY_STRING] => url=test

Cadena de consulta

http://domain.com/test?123

[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

http://domain.com/

[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

http://domain.com/test

[PHP_SELF] => /index.php/test [PATH_INFO] => /test [REQUEST_URI] => /test [QUERY_STRING] => [REDIRECT_LANGUAGE] =>

Idioma

http://domain.com/en

[PHP_SELF] => /index.php/ [PATH_INFO] => / [REQUEST_URI] => /en [QUERY_STRING] => [REDIRECT_LANGUAGE] => en

Ruta del idioma

http://domain.com/en/test

[PHP_SELF] => /index.php/test [PATH_INFO] => /test [REQUEST_URI] => /en/test [REDIRECT_LANGUAGE] => en

Cadena de consulta de idioma

http://domain.com/en/test?123

[PHP_SELF] => /index.php/test [PATH_INFO] => /test [REQUEST_URI] => /en/test?123 [QUERY_STRING] => 123 [REDIRECT_LANGUAGE] => en