/*
 * ArraKISS; 🚀 Capsule;
 * tout; log; twtxt; à propos & contact;
 */

Page d'erreur personnalisée avec httpd

Ici je propose de modifier les sources d'httpd pour afficher une page d'erreur personnalisée.

Pour bien se comprendre :

Notez que toutes les pages d'erreurs, pas seulement la page 404 seront modifiées.

FAQ

# user mod -G wsrc user
$ cd /usr/src
$ ftp -o /tmp/src.tar.gz $(head -n1 /etc/installurl)/$(uname -r)/src.tar.gz
$ tar xzf /tmp/src.tar.gz

Ensuite, on va éditer les sources de httpd :

$ cd /usr/src/usr.sbin/httpd
$ vi server_http.c

Vous devez modifier la fonction server_abort_http :

Dans la variable style, vous pouvez modifier le CSS.  Ici, je définis une classe "bg" pour qu'elle ait une image en arrière-plan.

/* A CSS stylesheet allows minimal customization by the user */
style = "body { background-color: white; color: black; font-family: "
    "'Comic Sans MS', 'Chalkboard SE', 'Comic Neue', sans-serif; }\n"
    "hr { border: 0; border-bottom: 1px dashed; }\n"
    "body, html { height: 100%;font-family: 'Comic Sans MS', cursive;}\n"
    ".bg { background-image: url('/img/Calvin-Hobbes-lost.jpg');\n"
    	"height: 100%;\n"
    	"background-position: center;\n"
    	"background-repeat: no-repeat;\n"
    	"background-size: cover;\n"
      "}";

Ensuite, vous pouvez modifier le code html à proprement parler.  J'y ajoute la classe "bg" au corps de la page, ainsi qu'un lien de retour vers une page précise de mon site.

/* Generate simple HTML error document */
if ((bodylen = asprintf(&body,
    "<!DOCTYPE html>\n"
    "<html>\n"
    "<head>\n"
    "<meta http-equiv=\"Content-Type\" content=\"text/html;"
    "charset=utf-8\"/>\n"
    "<title>%03d %s</title>\n"
    "<style type=\"text/css\"><!--\n%s\n--></style>\n"
    "</head>\n"
    "<body class='bg'>\n"
    "<h1>%03d %s</h1>\n"
    "<hr>\n<address>%s</address>\n"
    "<a href='/archive.html'>Retour \xc3\xa0 la page de recherche</a>\n"
    "</body>\n"
    "</html>\n",
    code, httperr, style, code, httperr, HTTPD_SERVERNAME)) == -1) {
    	body = NULL;
    	goto done;
}

Ensuite on recompile :

$ make
# make install
# rcctl restart httpd