До відповіді Одіна дуже мало додати. Я просто відчув на собі повний приклад із запиту 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 запиту - це каталог.