Chybov strnka je strnka, kterou uvid nvtvnci Vaeho webu, kdy nco nepjde dle plnu, napklad pokud se pokus otevt (ji) neexistujc strnku, nebo pokud dojde k njak jin chyb. Jak nastavit chybovou strnku jsem psal v prvnm dle serilu o htaccess.
Jednm z monch een sloitjch pejmenovn je vygenerovat seznam pesunutch strnek a vechny je zapsat do htaccessu. Avak pedstava naplnn souboru .htaccess stovkami/tisci redirecty se mi moc nezamlouv. Jednak kvli nepehlednosti, ale hlavn bych oekval zven zte. Htaccess se toti provuje pi kadm poadavku o strnku - tedy i pi normlnm poadavku na nepesunutou strnku se budou prochzet vechny redirecty v htaccess. Navc ance, e poadovan soubor bude prv njak pesunut web je docela mal (pokud tedy stle neodkazujete starmi odkazy).
Dalm, ekl bych pohodlnjm, zpsobem je naskriptovn vlastn chybov strnky. Tato monost nevyaduje zahlcen souboru htaccess a nebude tedy v dnm ppad zbyten brzdit bn natn existujcch strnek. Pouze v ppad nenalezen strnky se vyvol chybov strnka. Ta se pak pomoc serverovho skriptovacho jazyka (php) postar o dan pesmrovn. A a v ppad jejho nespchu me nakonec zahlsit klasickou chybu 404.
Strnka, kter byla poadovna je uloena v serverov promnn $_SERVER["REQUEST_URI"]. Pomoc tto promnn mete napklad vyrobit vlastn chybovou strnku 404, kter si ze serverov promnn zjist, jak strnka byla poadovna a porovn ji s databz pesmrovanch strnek. V ppad, e poadovan strnka byla pesunuta jinam, pole se pes HTTP hlaviky pesmrovn na novou adresu. V ppad nenalezen strnky ani v na pesmrovvac databzi nm nezbv jin monost, ne poslat opravdovou chybu 404.
een takovho skriptu je velmi jednoduch:
<?php
function return_301($url)
{
header('HTTP/1.1 301 Moved Permanently');
header('Location: '.$url);
die("<html><body> Dokument byl pesunut na <a href=\"".$url."\"> ".$url." </a></body></html>");
}
$pozadovana = $_SERVER["REQUEST_URI"];
if (strpos($pozadovana,'stara-url-1.htm')!==false) return_301('nova-url-1.htm');
elif (strpos($pozadovana,'stara-url-2.htm')!==false) return_301('nova-url-2.htm');
elif (strpos($pozadovana,'stara-url-3.htm')!==false) return_301('nova-url-3.htm');
else
{
header("HTTP/1.1 404 Not Found");
die("<html><body><h1>Strnka nenalezena.</h1></body></html>");
}
?>
Funkce return_301() se star o trval pesmrovn pomoc http hlaviek na adresu zadanou jako parametr tto funkce. Skript probh nsledovn: Do promnn $pozadovana se nate jmno poadovan strnky a ta se pot pomoc podmnek porovn s definovanmi pesmrovnmi. Pokud pro danou strnku existuje definovan ekvivalent, provede se pesmrovn, jinak se projdou vechny podmnky a zobraz se chybov strnka s chybou 404.
Pro porovnvn adres pouvm funkci strpos(), kter vyhled, jestli je jeden etzec obsaen v druhm. Mete vak pout libovoln systm porovnvan adres. Dokonce vbec nemuste zapisovat dan url pmo do skriptu, mete je natat ze souboru, vyhledvat v databzi apod. Monosti vylepen jsou opravdu velk, u nemuste spolhat jen na pesn pesmrovvn, mete dokonce opravovat peklepy v adresch, prohledvat web na obsaen klov slova a zobrazovat nejrelevantnj vsledky atd atd.
if (strpos($pozadovana,'stara-url-1.htm')!==false) return_301('nova-url-1.htm');
elif (strpos($pozadovana,'stara-url-2.htm')!==false) return_301('nova-url-2.htm');
elif (strpos($pozadovana,'stara-url-3.htm')!==false) return_301('nova-url-3.htm');
[1] Samuraj dne 19.06.2007:
Jet poznamenm:aby v promnn byla poadovan hodnota, je teba mt v souboru htaccess zadanou chybovou strnku s RELATIVN cestou.