PHP AUTO vs RUTA INFORMACIÓN vs SCRIPT NOMBRE vs SOLICITUD URI


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 la URI. Por ejemplo, http://www.example.com/faq/whatever se dirigirá 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, solo revisaría php_self, pero en este caso siempre es index.php. Puedo conseguirlo de REQUEST_URI, PATH_INFO, etc. Pero estoy tratando de decidir cuál será más confiable. ¿Alguien sabe (o sabe dónde encontrar) la verdadera diferencia entre PHP_SELF, PATH_INFO, SCRIPT_NAME, y REQUEST_URI? ¡Gracias por tu ayuda!

Nota : He tenido que agregar espacios, como ve el subrayado, y lo hace en cursiva por alguna razón.

Actualizado: Se corrigieron los espacios.

Author: imlouisrussell, 2008-11-11

9 answers

La documentación de PHP puede decirte la diferencia:

'PHP_SELF'

El nombre de archivo del script en ejecución, relativo a la raíz del documento. Por ejemplo, $_SERVER['PHP_SELF'] en una secuencia de comandos en la dirección http://example.com/test.php/foo.bar sería /prueba.php / foo.bar . La constante __FILE__ contiene la ruta completa y el nombre del archivo actual (es decir, incluido). Si PHP es ejecutándose 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 apuntar 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 le dio para acceder a esta página; por ejemplo, '/index.html ' .

PATH_INFO no parece estar documentado...

 44
Author: Jeremy Ruten,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-11 05:20:25

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 (

Ejemplo 2. REQUEST_URI es diferente de SCRIPT_NAME cuando un se introduce 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 el redireccionamiento del lado del servidor está en efecto (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.
Uso de la directiva apache ErrorDocument 404 /404error.php
http://example.com/test.php

[REQUEST_URI] => /test.php
[SCRIPT_NAME] => /404error.php

En el servidor IIS usando páginas de error personalizadas
http://example.com/test.php

[SCRIPT_NAME] => /404error.php
[REQUEST_URI] => /404error.php?404;http://example.com/test.php
 208
Author: Odin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-11 18:43:10

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] => 

Ruta

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 same

[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] => 

Ruta

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 same

[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

Ruta

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
 19
Author: Mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-19 16:06:59

Rutas PHP

  $_SERVER['REQUEST_URI']    = Ruta web, URI solicitado
    $_SERVER['PHP_SELF']    = Ruta web, archivo solicitado + información de ruta
    $_SERVER['SCRIPT_NAME']    = Ruta web, archivo solicitado
    $_SERVER['SCRIPT_FILENAME']   = Ruta del archivo, archivo solicitado
    __FILE__    = Ruta del archivo, archivo actual

Donde

  • File path es una system file path como /var/www/index.php, después de la resolución de alias
  • Web path es un server document path como /index.php desde http://foo.com/index.php, y puede que ni siquiera coincida cualquier archivo
  • El 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 toda la ruta url {[32] } a una ruta del archivo del sistema para obtener SCRIPT_FILENAME
  5. El archivo de script resultante puede incluir otros, donde __FILE__ se refiere a la ruta de acceso a la file
 6
Author: Beejor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-18 01:41:33

Es posible que desee buscar en la Clase URI y hacer uso de this this - > uri - >uri_string ()

Devuelve una cadena con el URI completo.

Por ejemplo, si esta es tu URL completa:

http://example.com/index.php/news/local/345

La función devolvería esto:

/news/local/345

O usted podría hacer uso de los segmentos para profundizar áreas específicas sin tener que llegar a parsing/regex valores

 4
Author: Adam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-11 05:09:02

Personalmente uso el $REQUEST_URI ya que hace referencia al URI introducido y no a la ubicación en el disco del servidor.

 3
Author: Xenph Yan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-07 07:26:16

Hay muy poco que añadir a la respuesta de Odín. 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 es

<?php
include ("script_included.php")
?>

Donde /var/www/test/php/script_included.php está

<?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 petición http es

www.example.com/test/before_rewrite/script.php/path/info?q=helloword

La salida será be

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

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 del archivo del sistema SCRIPT_FILENAME y __FILE__, no a las rutas URL, que se definen antes - ver excepciones más abajo. Los alias pueden usar toda la ruta de URL, incluyendo PATH_INFO. No podría haber ninguna conexión entre SCRIPT_NAME y SCRIPT_FILENAME.

No es totalmente exacto que los alias sean no resuelto en el momento en que se define la ruta de URL [PHP_SELF] = [SCRIPT_NAME] + [PATH_INFO], porque los alias se consideran para buscar en el sistema de archivos y sabemos por 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 el archivo no se encuentra. 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 como Alias \index.php \var\www\index.php y el uri de solicitud es un directorio.

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-19 18:17:03

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 PHP devuelve, siempre es una buena idea verificar la salida de la máquina en caso de que las reescrituras en el archivo de configuración del servidor estén causando resultados diferentes de los esperados. Guárdalo como algo como _inf0.php:

<?php
    $my_ip = '0.0.0.0';

   if($_SERVER['REMOTE_ADDR']==$my_ip){
     phpinfo();
   } else {
     //something
   }

Entonces llamarías /_inf0.php?q=500

 0
Author: AbsoluteƵERØ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-23 14:46:16

Copia de seguridad un segundo, usted ha tomado el enfoque equivocado para empezar. ¿Por qué no hacer esto

RewriteEngine on
RewriteCond $1 !^(images|inc|favicon\.ico|index\.php|robots\.txt)
RewriteRule ^(.*)$ /index.php?url=$1 [L]

En su lugar? Luego agárralo con $_GET['url'];

 -2
Author: Kate Gregory,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-30 20:55:01