Odkazy na adresáře

Školení, která pořádám

Když chcete vytvořit odkaz na adresář (např. http://jakub.vrana.cz/utility/), je vhodné na konci cesty uvádět lomítko, protože při dotazu bez lomítka vrátí server nejprve přesměrování na cestu s lomítkem a zbytečně se tak provádí o jeden dotaz-odpověď navíc. Platí to samozřejmě i při vytváření relativních odkazů. Ověřit to můžete jednoduchým skriptem:

<?php
// s využitím zázemí PHP
$fp = fopen($_GET["url"], "r");
$meta_data = stream_get_meta_data($fp);
echo implode("\n", $meta_data["wrapper_data"]);
fclose($fp);

// ručně pomocí funkce fsockopen
$url = parse_url($_GET["url"]);
$fp = fsockopen($url["host"], 80);
fwrite($fp, "GET ". ($url["path"] ? $url["path"] : "/") . ($url["query"] ? "?$url[query]" : "") ." HTTP/1.1\r\n");
fwrite($fp, "Host: $url[host]\r\n");
fwrite($fp, "\r\n");
while (strlen(trim($line = fgets($fp), "\r\n")) && !feof($fp)) {
    echo $line;
}
fclose($fp);
?>

V PHP 5 je k dispozici také funkce get_headers.

Lomítkem nemusí být ukončen odkaz do kořenového adresáře (např. http://www.example.com), protože v tom případě lomítko doplní rovnou prohlížeč, jeho uvedením ale rozhodně nic nezkazíte.

Častou chybou je také odkazování se na index.php nebo jiné soubory, které se používají jako výchozí pro adresář (v Apache se to nastavuje direktivou DirectoryIndex). Chyba je to proto, že pro všechny aplikace je / něco jiného než /index.php, takže se tříští pozornost vyhledávačů a matou se cache, navíc odkazy nejsou tak pěkné. Pokud se chcete odkázat např. na svou domácí stránku, použijte <a href=".">. Pokud chcete domácí stránce předat parametry, stačí použít ?parametry, při odkazu z jiné stránky potom raději ./?parametry (podle nové normy vede odkaz začínající otazníkem do aktuálního adresáře, podle staré potom k aktuálnímu souboru).

Jakub Vrána, Dobře míněné rady, 1.8.2005, diskuse: 4 (nové: 0)

Diskuse

Vilém Málek:

Odkazy typu "?parametry" rozhodně nedoporučuji používat. Existuje mnoho programů, které je neumí správně vyhodnotit, a řadí se k nim i boti a crawlery některých vyhledávačů. Nechcete-li mít problémy, je lepší si v PHP napsat funkci, která všechny odkazy ve stránkách převede na absolutní, s uvedením celé cesty i jména serveru. Když nic jiného, ušetříte si prostor v logu 404 ;–)

ikona spaze:

k tomu zjistovani, ja radeji pouzivam HEAD na unixu:

$ HEAD -S http://exploited.cz/the-daily-standa
HEAD http://exploited.cz/the-daily-standa --> 301 Moved Permanently
HEAD http://exploited.cz/the-daily-standa/ --> 200 OK
...

Co se tyce presmerovani na koncovy lomitko u adresaru, v Apache za to muze mod_dir, u novejsich verzi to lze vypnout pomoci DirectorySlash[1] -- je dobry poznamenat, ze URL pro presmerovani se vytvari bud z hostname, resp. ServerName nebo z HTTP hlavicky Host podle nastaveni UseCanonicalName[2].

[1] http://httpd.apache.org/docs/2.0/mod/mod_dir.html#directoryslash
[2] http://httpd.apache.org/docs/2.0/mod/core.html.en#usecanonicalname

ikona Jakub Vrána OpenID:

Díky za vynikající věcné upřesnění. Zjištění hlaviček v PHP jsem uvedl hlavně proto, že to je blog o PHP :-).

Leo:

Pokud jde o to overit si, ze dochazi k presmerovani, staci uplne prohlizec hlavicek jako je treba Live HTTP Headers pro FF. Leo

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.