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.
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...
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):
[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
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
[PHP_SELF] => /index.php
[PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script)
[REQUEST_URI] => /
[QUERY_STRING] =>
Ruta
[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 same
[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] =>
Ruta
[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 same
[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
Ruta
[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
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
desdehttp://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
- 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 toda la ruta url {[32] } a una ruta del archivo del sistema para obtener
SCRIPT_FILENAME
- El archivo de script resultante puede incluir otros, donde
__FILE__
se refiere a la ruta de acceso a la file
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
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.
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.
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
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'];
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