La gestion des pages 404

Il est possible de créer facilement un squelette pour la page d’erreurs 404 qui sera affichée si l’internaute demande une page qui n’existe pas.

Page d’erreur 404 , quesaco ?

Lorsqu’une personne navigue dans le Web, il peut lui arriver d’appeler une page web qui n’existe pas. Lorsqu’un serveur web reçoit la demande pour cette page, il répond alors par une page web spécifique (pour signaler que la page demandée n’existe pas), définie par le propriétaire du site (ou par défaut celle fournie avec le serveur), et qui contient généralement un message d’explication, et est accompagnée d’un code de réponse « 404 » du protocole http (qui, seul, ne serait pas très explicite), d’où le nom de « page 404 » parfois donné à ce genre de page.

Et SPIP dans tout ça ?

Il peut également arriver qu’un utilisateur demande un fichier qui existe, mais qui, faute d’information, n’apporte pas de contenu. Pour prendre un exemple avec SPIP, si quelqu’un tape dans son navigateur un adresse comme comme http://adresse-d-un-site-spip/spip.php?article520, et que l’article 520 n’existe pas encore — ou n’est pas publié en ligne —, il serait logique que SPIP retourne un message d’erreur de la même façon que la procédure précédemment décrite. On pourrait qualifier cela de « pseudo erreur 404 ».

C’est effectivement ce que fait SPIP. Il retourne une page 404 construite à partir d’un squelette. Pour la personnaliser, il suffit donc de créer son propre fichier 404.html, comme n’importe quel squelette SPIP. Ce fichier 404.html sera donc enregistré avec les autres squelettes que vous avez créés (voir à ce sujet l’article « Où placer les fichiers de squelettes ? »).

Réglage de SPIP

SPIP ne peut pas savoir tout seul quand retourner cette « pseudo erreur 404 », il faut donc lui expliciter dans chacun des squelettes qui pourrait la générer.

Par convention, SPIP va retourner la page d’erreur 404 seulement quand le contenu retourné par le squelette est complètement vide.

Le principe est assez simple, par exemple :

  • le squelette de recherche, s’il ne trouve pas de résultats, affichera la page de recherche, probablement avec un message informant l’utilisateur de l’échec de la recherche. Mais il ne retournera pas une « pseudo erreur 404 ».
  • par contre, un squelette d’article, si on lui demande un article qui n’existe pas ne doit pas afficher de page article, mais la « pseudo erreur 404 ».

Pour reprendre l’exemple de l’article 520 non publié ou inexistant et de l’appel d’une l’url http://adresse-d-un-site-spip/spip.php?article520, il faudrait concevoir le squelette article de la manière suivante :

<BOUCLE_principale(ARTICLES) {id_article}>
.... Code HTML, y compris entête ...
</BOUCLE_principale>

La boucle _principale ne retourne rien si l’on demande un article inexistant ou non publié, le résultat produit sera alors une page vide, et SPIP engendrera un message d’erreur et retournera une « pseudo erreur 404 ».

Réglage du serveur Web

Cette procédure est nécessaire pour les pages d’erreurs 404 « normales », c’est à dire dues à l’absence du fichier demandé par l’utilisateur.

La méthode la plus simple est de se servir du fichier .htaccess fournit par SPIP, même si vous ne vous servez pas des URLs propres. Pour cela :

  1. Modifiez le fichier htaccess.txt et enlevez le # au début de la ligne
    # ErrorDocument 404 /spip.php?page=404
    

    Cette ligne est commentée par défaut pour éviter l’appel trop fréquent à une page dynamique (calculée par SPIP), notamment par des robots qui requêtent des urls non conformes.

  2. Renommez le fichier htaccess.txt livré en standard en .htaccess.

Attention ! il peut arriver que votre hébergeur désactive l’usage du fichier .htaccess, auquel cas il faudra le contacter pour résoudre ce problème.

Produire une page réellement vide

Il peut arriver de vouloir retourner une page vide sans provoquer une "pseudo erreur 404". Pour cela, il suffit de mettre

#HTTP_HEADER{content-type:text/html}

Auteur Maïeul Publié le : Mis à jour : 20/04/23

Traductions : català, English, Español, français, italiano, Nederlands