V PHP je k dispozici několik obratů, jak se soubor může odkazovat sám na sebe. Kromě „konstanty“ __FILE__, která vždy obsahuje absolutní cestu k aktuálně zpracovávanému souboru (hodí se např. tehdy, když chceme vložit soubor ve vložené knihovně: include dirname(__FILE__) . "/soubor.inc.php"
), je definováno ještě několik $_SERVER proměnných. Následující platí pro Apache, u jiných serverů by to mělo být obdobně.
podmínky | požadavek / 'REQUEST_URI' | 'PHP_SELF' | 'SCRIPT_NAME' |
---|---|---|---|
DirectoryIndex index.php | /?a | /index.php | /index.php |
AcceptPathInfo | /item.php/clanek-1?a | /item.php/clanek-1 | /item.php |
ErrorDocument | /clanek-1?a | /item.php | /item.php |
RewriteEngine | /clanek-1?a | /item.php | /item.php |
PHP-cli | test/item.php / nenastaveno | test/item.php od PHP 4.3.0 | test/item.php |
Pro vytvoření absolutního URL na související soubor (např. pro hlavičku Location nebo pro poslání e-mailem), se často používá funkce dirname. Ta má však tu nevýhodu, že pro kořenový adresář vrací /
a v jiném případě řetězec lomítkem neukončuje. Lepší je proto použít např. tento zápis:
<?php header("Location: http://$_SERVER[SERVER_NAME]" . substr($_SERVER["PHP_SELF"], 0, strrpos($_SERVER["PHP_SELF"], "/")) . "/"); ?>
Skripty pak bez problémů fungují jak v kořenovém adresáři webového serveru, tak v podadresáři.
Za zmínku stojí také proměnná 'SERVER_NAME'. Pokud mě paměť neklame, byla v prastarých verzích PHP nastavena na hodnotu gethostbyname($_SERVER["SERVER_ADDR"])
, takže se při použití VirtualHost nedala použít a bylo nutné se spoléhat na 'HTTP_HOST'. Tato proměnná ale zase není k dispozici při použití HTTP/1.0. Nyní by proměnná 'SERVER_NAME' měla obsahovat vždy tu správnou hodnotu.
Odkazování na sebe sama se často používá u atributu <form action>
. Pokud ale skriptu např. nechceme předat nějaké další parametry, stačí jako hodnotu použít prázdný řetězec. Jak píše Sean Coates, je potřeba proměnnou 'PHP_SELF' ošetřit stejně jako ostatní uživatelská data.
Diskuse je zrušena z důvodu spamu.