.htaccess : mettre en place une page 404 personnalisée
Voici plusieurs techniques pour afficher sa propre page d'erreur en passant par le fichier .htaccess.
En paramétrant le fichier ".htaccess", il est possible de gérer soi-même les erreurs HTTP 404, qui indiquent un fichier ou une page non trouvé(e). On peut de cette manière afficher sa propre page d'erreur. Il existe plusieurs techniques permettant de réaliser ce procédé, mais toutes ne sont pas toujours appropriées.
La première solution consiste à utiliser la directive la directive "RewriteCond" qui définit une condition à remplir, puis la directive "RewriteRule" qui indique la redirection à effectuer vers une nouvelle page. Il faudrait préciser en condition le fait que la page demandée n'est ni un fichier ni un répertoire :
# Redirection avec les directives RewriteCond et RewriteRule
# Si la page demandée n'est pas un fichier
RewriteCond % !-f
# Si elle n'est pas non plus un répertoire
RewriteCond % !-d
# On redirige vers la page d'erreur personnalisée.
RewriteRule ^(.*)$ http://www.monsite.fr/page-non-trouvee.html [L]
Bien que cette solution fonctionne dans certains cas, les cas "classiques", elle possède des défauts. Mais il existe une autre directive spécialement dédiée.
En effet, la directive "ErrorDocument" précise la page appelée lorsqu'un code d'erreur survient. Avec cette directive, le code précédent est réduit à une seule ligne :
ErrorDocument 404 /page-non-trouvee.html
Il y a de nombreux avantages à utiliser la directive "ErrorDocument". En utilisant la directive "RewriteRule", on envoie au navigateur un code "200". Ce code indique qu'il s'agit d'une bonne requête alors qu'en réalité il s'agit d'une requête erronée. La directive "ErrorDocument" renvoie quant à elle le code d'erreur indiqué, ici "404". Il est possible de renvoyer un code d'erreur avec la directive "RewriteRule" (en utilisant le drapeau [R=404]), mais si vous utilisez cette méthode, le navigateur va ignorer la règle de réécriture pour aller chercher la nouvelle page dans la directive "ErrorDocument".
Pour finir, sachez que les deux directives ne sont pas lues au même moment par le serveur Apache. La directive "RewriteRule" fait partie du module "mod_rewrite" d'Apache. Ce module est exécuté avant d'autres, comme "mod_proxy". Il est donc possible que la règle de réécriture soit appliquée avant que d'autres traitements aient été effectués. La directive "ErrorDocument" est exécutée après que toutes les règles possibles aient été utilisées pour trouver le document. Il est donc plus naturel d'utiliser cette dernière directive.
Sur .htaccess, lire aussi ces fiches pratiques