К ответу Одина добавить очень мало. Я просто хотел предоставить полный пример от HTTP-запроса к фактическому файлу в файловой системе, чтобы проиллюстрировать эффекты перезаписи URL-адресов и псевдонимов. В файловой системе сценарий /var/www/test/php/script.php
является
<?php
include ("script_included.php")
?>
где /var/www/test/php/script_included.php
находится
<?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>";
?>
и /var/www/test/.htaccess
это
RewriteEngine On
RewriteRule before_rewrite/script.php/path/(.*) after_rewrite/script.php/path/$1
а файл конфигурации Apache включает псевдоним
Alias /test/after_rewrite/ /var/www/test/php/
а HTTP-запрос
www.example.com/test/before_rewrite/script.php/path/info?q=helloword
Выход будет
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
Всегда верно следующее
PHP_SELF = SCRIPT_NAME + PATH_INFO = full url path between domain and query string.
Если нет перезаписи mod_rewrite, mod_dir, ErrorDocument или любой формы перезаписи URL, у нас также есть
REQUEST_URI = PHP_SELF + ? + QUERY_STRING
Псевдонимы влияют на пути к системным файлам, SCRIPT_FILENAME
а __FILE__
не на пути URL, которые были определены ранее - см. Исключения ниже. Псевдонимы могут использовать весь URL-путь, включая PATH_INFO
. Там не может быть никакой связи между SCRIPT_NAME
и SCRIPT_FILENAME
.
Не совсем точно, что псевдонимы не разрешаются во время определения пути URL [PHP_SELF] = [SCRIPT_NAME] + [PATH_INFO]
, потому что псевдонимы считаются для поиска в файловой системе, и из примера 4 в ответе Odin мы знаем, что в файловой системе выполняется поиск, чтобы определить, существует ли файл, но это актуально только тогда, когда файл не найден. Аналогично, mod_dir вызывает mod_alias для поиска в файловой системе, но это актуально только в том случае, если у вас есть псевдоним, например, а Alias \index.php \var\www\index.php
запрос uri - это каталог.