Do odpowiedzi Odyna można dodać bardzo niewiele. Po prostu poczułem, że mogę podać kompletny przykład z żądania HTTP do rzeczywistego pliku w systemie plików, aby zilustrować skutki przepisywania adresów URL i aliasów. W systemie plików skrypt /var/www/test/php/script.php
to
<?php
include ("script_included.php")
?>
gdzie /var/www/test/php/script_included.php
jest
<?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>";
?>
i /var/www/test/.htaccess
jest
RewriteEngine On
RewriteRule before_rewrite/script.php/path/(.*) after_rewrite/script.php/path/$1
a plik konfiguracyjny Apache zawiera alias
Alias /test/after_rewrite/ /var/www/test/php/
a żądanie http to
www.example.com/test/before_rewrite/script.php/path/info?q=helloword
Wynik będzie
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
Zawsze obowiązuje
PHP_SELF = SCRIPT_NAME + PATH_INFO = full url path between domain and query string.
Jeśli nie ma mod_rewrite, mod_dir, przepisywania ErrorDocument lub jakiejkolwiek formy przepisywania adresu URL, mamy również
REQUEST_URI = PHP_SELF + ? + QUERY_STRING
Aliasy wpływają na systemowe ścieżki plików, SCRIPT_FILENAME
a __FILE__
nie na ścieżki URL, które zostały wcześniej zdefiniowane - zobacz wyjątki poniżej. Aliasy mogą wykorzystywać całą ścieżkę adresu URL, w tym PATH_INFO
. W ogóle nie mogło być żadnego połączenia między SCRIPT_NAME
a SCRIPT_FILENAME
.
Nie jest całkowicie dokładne, że aliasy nie są rozwiązywane w momencie [PHP_SELF] = [SCRIPT_NAME] + [PATH_INFO]
definiowania ścieżki URL , ponieważ uważa się, że aliasy przeszukują system plików, a wiemy z przykładu 4 w odpowiedzi Odyna, że system plików jest przeszukiwany w celu ustalenia, czy plik istnieje, ale ma to znaczenie tylko wtedy, gdy plik nie zostanie znaleziony. Podobnie, mod_dir wywołuje mod_alias w celu przeszukania systemu plików, ale ma to znaczenie tylko wtedy, gdy masz alias taki jak, Alias \index.php \var\www\index.php
a uri żądania jest katalogiem.