Chybová stránka je stránka, kterou uvidí návštěvníci Vašeho webu, když něco nepůjde dle plánu, například pokud se pokusí otevřít (již) neexistující stránku, nebo pokud dojde k nějaké jiné chybě. Jak nastavit chybovou stránku jsem psal v prvním díle seriálu o htaccess.
Jedním z možných řešení složitějších přejmenování je vygenerovat seznam přesunutých stránek a všechny je zapsat do htaccessu. Avšak představa naplnění souboru .htaccess stovkami/tisíci redirecty se mi moc nezamlouvá. Jednak kvůli nepřehlednosti, ale hlavně bych očekával zvýšení zátěže. Htaccess se totiž prověřuje při každém požadavku o stránku - tedy i při normálním požadavku na nepřesunutou stránku se budou procházet všechny redirecty v htaccess. Navíc šance, že požadovaný soubor bude právě nějaký přesunutý web je docela malá (pokud tedy stále neodkazujete starými odkazy).
Dalším, řekl bych pohodlnějším, způsobem je naskriptování vlastní chybové stránky. Tato možnost nevyžaduje zahlcení souboru htaccess a nebude tedy v žádném případě zbytečně brzdit běžné načítání existujících stránek. Pouze v případě nenalezení stránky se vyvolá chybová stránka. Ta se pak pomocí serverového skriptovacího jazyka (php) postará o dané přesměrování. A až v případě jejího neúspěchu může nakonec zahlásit klasickou chybu 404.
Stránka, která byla požadována je uložena v serverové proměnné $_SERVER["REQUEST_URI"]. Pomocí této proměnné můžete například vyrobit vlastní chybovou stránku 404, která si ze serverové proměnné zjistí, jaká stránka byla požadována a porovná ji s databází přesměrovaných stránek. V případě, že požadovaná stránka byla přesunuta jinam, pošle se přes HTTP hlavičky přesměrování na novou adresu. V případě nenalezení stránky ani v naší přesměrovávací databázi nám nezbývá jiná možnost, než poslat opravdovou chybu 404.
Řešení takového skriptu je velmi jednoduché:
<?php
function return_301($url)
{
header('HTTP/1.1 301 Moved Permanently');
header('Location: '.$url);
die("<html><body> Dokument byl přesunut 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>Stránka nenalezena.</h1></body></html>");
}
?>
Funkce return_301() se stará o trvalé přesměrování pomocí http hlaviček na adresu zadanou jako parametr této funkce. Skript probíhá následovně: Do proměnné $pozadovana se načte jméno požadované stránky a ta se poté pomocí podmínek porovná s definovanými přesměrováními. Pokud pro danou stránku existuje definovaný ekvivalent, provede se přesměrování, jinak se projdou všechny podmínky a zobrazí se chybová stránka s chybou 404.
Pro porovnávání adres používám funkci strpos(), která vyhledá, jestli je jeden řetězec obsažen v druhém. Můžete však použít libovolný systém porovnávaní adres. Dokonce vůbec nemusíte zapisovat dané url přímo do skriptu, můžete je načítat ze souboru, vyhledávat v databázi apod. Možnosti vylepšení jsou opravdu velké, už nemusíte spoléhat jen na přesné přesměrovávání, můžete dokonce opravovat překlepy v adresách, prohledávat web na obsažená klíčová slova a zobrazovat nejrelevantnější výsledky 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:
Ještě poznamenám:aby v proměnné byla požadovaná hodnota, je třeba mít v souboru htaccess zadanou chybovou stránku s RELATIVNÍ cestou.