Очень мало что можно добавить к ответу Одина. Я просто хотел представить полный пример от 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 в ответе Одина, что файловая система ищется в определить, существует ли файл, но это актуально, только если файл не найден. Аналогично, mod_dir вызывает mod_alias для поиска в файловой системе, но это актуально только в том случае, если у вас есть псевдоним, такой как Alias \index.php \var\www\index.php
, а запрос uri является каталогом.