- 1. Présentation du problème
- 2. Résumé de la solution proposée
- 3. Conception de la page d’erreur 404
- 4. Gestion des « vraies » erreur 404
- 5. Gestion des articles, rubriques, et autres objets SPIP appelés avec un identifiant inexistant
- 6. Conclusion
1. Présentation du problème
Plusieurs raisons peuvent conduire un internaute (d’un site sous SPIP) à naviguer vers du contenu inexistant :
- L’URL demandée ne correspond à aucun fichier du serveur (même après réécriture de l’URL) : il s’agit d’une erreur 404 « authentique », donc gérée par le serveur web (Apache, etc.).
- L’URL demandée correspond bien à un squelette existant de SPIP (article, rubrique, brève, auteur, etc.), mais l’identifiant de l’objet demandé n’est pas trouvé dans la base SPIP : il s’agit d’une simple erreur d’accès aux données de la base SPIP, donc gérée par le moteur SPIP.
Du point de vue de l’utilisateur/internaute (qui se moque finalement de savoir si le site est construit sous SPIP ou autre), il n’est pas forcément intéressant de dissocier ces deux types d’erreurs.
L’objectif de cette contribution est de vous permettre de rediriger toutes ces réponses en erreur vers la même page de type « 404 Not found » [1].
2. Résumé de la solution proposée
- Les « vraies » erreurs 404 seront traitées à l’aide des paramètres de configuration du serveur web (par exemple un fichier .htaccess dans le cas d’Apache).
- Les erreurs d’identifiants d’objets SPIP seront gérées dans les squelettes concernés, à l’aide de quelques lignes de PHP.
- Ces deux types d’erreur renverront vers le même contenu informatif, à savoir (dans mon exemple) le plan du site, agrémenté d’un petit message expliquant l’erreur survenue.
3. Conception de la page d’erreur 404
L’idée pour cette page est de réemployer la page de plan du site prévue dans SPIP : en cas d’erreur 404, l’internaute aura ainsi la possibilité de se rediriger vers le contenu qui l’intéresse, ou vers la page de recherche, etc.
3.1. Une nouvelle page d’erreur, basée sur le plan du site
Une fois élaboré un squelette de plan bien constitué (arborescence des rubriques et/ou des articles), vous vous retrouvez avec les deux fichiers :
- « plan.html » (squelette)
- « plan.php3 » (fichier PHP d’appel du squelette)
Pour personnaliser ce plan afin de mentionner une éventuelle erreur 404, créez un nouveau fichier « 404.php3 », contenant juste une ligne de plus que le fichier « plan.php3 » :
<?php
$error404 = true; //ligne ajoutée
$fond = "plan";
$delais = 2 * 3600;
include ("inc-public.php3");
?>
Seule la ligne « $error404 = true;
» a été ajoutée ; mais ce fichier PHP fait appel au même squelette « plan ».
3.2. Gestion des erreurs 404 dans le squelette du plan
Le squelette du plan du site (plan.html) est alors modifié pour prendre en compte cette variable PHP « $error404
», afin de modifier légèrement certains affichages (titre de la page, message indiquant qu’une erreur 404 s’est produite, etc.).
Voici le genre de modifications qui peuvent être apportées :
[Début du squelette]
<?php
/*
Gestion de la variable $error404,
afin qu'un appel SANS la variable
(par le fichier plan.php3) affiche
simplement le plan du site sans
messages d'erreur.
*/
if(!isset($error404)) { $error404 = false; }
?>
<html>
<head>
<title><?php
print($error404 ? "Erreur 404" : "Plan du site");
?></title>
<?php if($error404) { ?>
<meta name="robots" content="noindex, follow">
<?php } ?>
<base href="[(#URL_SITE_SPIP)]/" />
[...Suite du squelette...]
</head>
<body>
[...Suite du squelette...]
<h1><?php
print($error404 ? "Erreur 404" : "Plan du site");
?></h1>
<?php if($error404) { ?>
<p style="color: red;"><b>La page demandée
est introuvable.</b></p>
<p>Veuillez utiliser le plan ci-dessous
pour naviguer dans le site.</p>
<p>Si ce problème est récurrent, merci de
<a href="mailto:webmaster@mon_site_spip.test">contacter
le webmaster</a>.</p>
<?php } ?>
[...Suite et fin du squelette...]
Bien sûr, vous pouvez agencer ces petites modifications comme bon vous semble dans votre squelette.
L’idée est simplement d’exploiter à loisir la variable « $error404
» afin de personnaliser l’affichage :
- Si la page « plan.php3 » est appelée, le plan s’affiche simplement.
- Si une erreur 404 est déclenchée (et traitée par le script « 404.php3 » au moyen des mécanismes décrits plus loin), le plan s’affiche avec un titre adéquat et quelques messages d’explication, et la balise META
appropriée garantit que cette version du plan ne sera pas conservée par les moteurs de recherche [2].
4. Gestion des « vraies » erreur 404
La configuration du serveur web pour traiter les erreurs 404 sort du cadre de cet article :
- Pour personnaliser le fichier .htaccess sur un serveur Apache, consultez la contribution Le fichier .htaccess.
- Pour les autres serveurs web, consultez la documentation appropriée.
Dans tous les cas, faites en sorte que les erreurs 404 appellent le fichier /404.php3
Par exemple, sur un serveur Apache, ajoutez la ligne suivante dans le fichier .htaccess situé à la racine de votre site SPIP :
ErrorDocument 404 /404.php3
5. Gestion des articles, rubriques, et autres objets SPIP appelés avec un identifiant inexistant
Les boucles SPIP permettent d’afficher du code « alternatif », dans le cas où la boucle ne trouve aucune réponse [3].
Ce mécanisme, utilisant la balise (optionnelle) finale <//Bn> de la boucle, est décrit dans la documentation SPIP.
L’idée ici est d’utiliser ce mécanisme « natif » SPIP non pas pour afficher un message particulier (tel que « L’article demandé n’existe pas. ») mais pour provoquer l’affichage de la page d’erreur créée plus tôt.
Il suffit pour cela d’insérer au tout début des squelettes concernés un code PHP tel que :
<?php
<BOUCLE_test404(ARTICLES){id_article}>
/*
Ne rien faire si l'article existe,
mais laisser un court commentaire
tel que celui-ci pour que la
boucle fonctionne.
*/
</BOUCLE_test404>
header("HTTP/1.1 404 Not found");
header("Status: 404 Not found");
include("404.php3");
exit();
<//B_test404>
?>
Le code ci-dessus doit être ajouté au début squelette « article.html ».
Les en-têtes HTTP précisent au navigateur (ou au robot / moteur de recherche qui a demandé l’URL fautive) qu’il s’agit d’une erreur 404 : ainsi, les moteurs de recherche n’indexeront pas (ou désindexeront correctement) l’URL qui a provoqué l’erreur.
Des adaptations mineures de la boucle doivent bien sûr être faites pour tous les squelettes correspondant aux pages du site susceptibles d’être appelées avec un identifiant (selon votre exploitation de SPIP dans votre site : articles, rubriques, brèves, auteurs, forums, mots, documents, sites/syndication, ...).
Important :
Les squelettes propres à une rubrique doivent également être ainsi adaptés, afin de gérer par exemple le cas d’un article existant mais non publié : le squelette appelé par SPIP est bel et bien celui de la rubrique X (s’il existe) « article-X.html » ou « article=X.html », même si la boucle considère ensuite que l’article est inexistant.
Ce code est donc à adapter et placer au tout début de TOUS les squelettes qui correspondent à un type de page dans laquelle une boucle majeure se base sur un identifiant (id_article, id_rubrique, etc.).
Par exemple au début du (ou des) squelettes de rubriques :
<?php
<BOUCLE_test404(RUBRIQUES){id_rubrique}>
/*
Ne rien faire si la rubrique existe,
mais laisser un court commentaire
tel que celui-ci pour que la
boucle fonctionne.
*/
</BOUCLE_test404>
header("HTTP/1.1 404 Not found");
header("Status: 404 Not found");
include("404.php3");
exit();
<//B_test404>
?>
Au final, dans tous les cas, si l’objet SPIP indispensable à la page n’est pas trouvé, seul le contenu de la page 404.php3 s’affiche.
6. Conclusion
Cette solution, relativement simple, permet à toutes les erreurs de type « contenu non trouvé » de rediriger « proprement » (et avec les en-tête HTTP adéquats) l’internaute vers la même page d’erreur, qu’il s’agisse réellement d’une URL introuvable ou d’un objet SPIP introuvable (ou non-publié).
Vos commentaires sont les bienvenus !
Aucune discussion
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
Merci d’avance pour les personnes qui vous aideront !
Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.
Suivre les commentaires : |