Jít na obsah Jít na navigaci Jít na vyhledávání

Vlastní chybové hlášky v Apachi a PHP

Standardní chybové hlášky v Apachi jsou z informativního charakteru naprosto dostačující, avšak z toho estetického nikoli. Kdekoho posléze napadne, jak tyto chybové hlášky přenastavit. Na tom samozřejmě není nic těžkého, stačí vhodná úprava do souboru .htaccess typu:

ErrorDocument 404 /neexistuje.html

Mít pro každý kód chyby jinou stránku je pak zbytečně komplikované. Naštěstí existuje řešení, jak různé kódy efektivně zpracovat na úrovni PHP. Základní zjednodušené nastavení souboru .htaccess pak bude vypadat obdobně:

ErrorDocument 400 http://400.dragonjake.net
# speciální hack pro 401 Authorization Required
Alias /401/ /var/www/html/
ErrorDocument 401 /401/index.php

ErrorDocument 403 http://403.dragonjake.net
ErrorDocument 404 http://404.dragonjake.net
ErrorDocument 500 http://500.dragonjake.net

Ve svém řešení využívám externí http:// adresy pro jednotlivé kódy zvlášť, v Apachi nastavené zhruba takto:

<VirtualHost *:80>
        ServerName dragonjake.net
        ServerAlias 400.dragonjake.net 403.dragonjake.net 404.dragonjake.net 500.dragonjake.net
        DocumentRoot /var/www/html
</VirtualHost>

V adresáři /var/www/html se nachází nejočekávanější soubor, skript index.php, který chybové kódy zpracovává. Klíčová je superglobální proměnná $_SERVER['REDIRECT_STATUS'], která vrací HTTP stavový kód, podle kterého následně skript rozlišuje typ chyby.

Bohužel pro chybu 500 nevrátí proměnná z nepochopitelných důvodů nic. Skript používám i jako výchozí lokaci pro požadavky, které neodchytne žádný <VirtualHost>, např. když někdo zadá přímo IP adresu do prohlížeče. Zjištění chyby jsem tedy oprasil díky URL přes regulární výraz.

if (empty($code)) {
        preg_match('~(\d+)\.dragonjake\.net$~', $_SERVER['HTTP_HOST'], $m);
        $code = $m[1];
}

Úmyslně ve své implementaci nepoužívám žádný výpis URL adresy, která se běžně u podobných chybových hlášení objevuje. Zvědavcům napovím, že se jedná o proměnné $_SERVER['REQUEST_URI'] a $_SERVER['REDIRECT_URL']. Na závěr přikládám celý kód „chybového“ skriptu.

# determine status code, 500 does not work :(
if (empty($code)) {
        preg_match('~(\d+)\.dragonjake\.net$~', $_SERVER['HTTP_HOST'], $m);
        $code = $m[1];
}

# set text by status code
switch ($code) {
        case 400:
                $h = '400 Bad Request';
                $t = 'Err... what did you say?!';
                break;
        case 401:
                $h = '401 Authorization Required';
                $t = 'You haven\'t given me a gold!';
                break;
        case 403:
                $h = '403 Forbidden';
                $t = 'Step back before you get eaten!';
                break;
        case 404:
                $h = '404 File Not Found';
                $t = 'Are you looking for something?!';
                break;
        case 500:
                $h = '500 Internal Server Error';
                $t = 'Whops! Something got wrong!';
                break;
        default:
                $h = '';
                $t = 'Server is up and running.';
}

# send header
if (!empty($h))
        header($_SERVER['SERVER_PROTOCOL'] . ' ' . $h, TRUE, $code);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xml:lang="cs" lang="cs" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="content-language" content="cs" />
<meta name="author" content="Dragon Jake; e-mail: admin@dragonjake.net" />
<meta name="copyright" content="© 2006 Dragon Jake" />
<meta name="robots" content="noindex,nofollow" />
<link rel="stylesheet" type="text/css" href="/401/main.css" />
<link rel="shortcut icon" type="image/x-icon" href="/401/favicon.ico" />
<title><?php if (!empty($h)) echo $h . ' | '; ?>Dragon's Server</title>
</head>
<body>
<div id="logo"></div>
<h1><?php echo htmlspecialchars($t); ?></h1>
<a href="http://www.dragonjake.net">www.dragonjake.net</a>
</body>
</html>

Štítky:

Komentáře

Komentáře jsou uzavřeny