Il est relativement simple de personnaliser la page d’erreur de son site web avec des pages statiques grâce au fichier .htaccess. Par contre, ça devient un peu plus complexe si on veut utiliser cette même page d’erreur lorsqu’on évalue la valeur d’une variable dans une page dynamique et que celle-ci est fautive.
Par exemple, voyons la situation typique où une page dynamique recueille la valeur de la variable $id
dans le URL en mode GET
afin d’afficher le contenu approprié de votre base de donnée, comme suit:
http://www.example.com/page.php?id=10
Si la valeur, comme le nombre 10
, est celle attendue, il n’y a pas de problèmes. Mais si, à cause d’un mauvais lien extérieur, d’un visiteur curieux qui change la valeur, ou pire, un hacker qui cherche des failles de sécurité, la valeur change pour XYZ
, il faut afficher un message d’erreur indiquant que cette page n’existe pas (pour valider ces valeur, veuillez vous référer à l’article Se protéger des attaques par injection SQL). La façon la plus simple est de sortir du programme, comme suit:
if (!$id) exit("Pas de page à cette adresse");
Mais c’est un peu triste et peu convivial pour un visiteur qui a tout simplement suivi un mauvais lien et qui serait quand même intéressé à naviguer le reste du site si on lui offrait une page d’erreur 404 standard avec des menus de navigation. Qui plus est, il est préférable d’indiquer aux moteurs de recherche que cette page n’est pas valide et leur envoyer un code 404 standard avec les headers (en-têtes) du serveur, sinon ces moteurs pourraient enregistrer une quantité déraisonnable de pages fictives sur votre site et vous pénaliser.
Pour ce faire, nous allons développer une fonction de notre crue un peu plus avancée que le simple exit()
de PHP:
$id = $_GET["id"];
if ((!$id) || (!ereg("^[0-9]+$", $id))) exit404();
Si la valeur de $id
est vide ou n’est pas un nombre vérifié par la fonction PHP ereg
(grâce aux regular expressions, ou expressions rationelles en français), nous faisons appel à la fonction exit404()
, définie comme suit:
function exit404() {
global $_SERVER;
header ("HTTP/1.1 404 Not Found");
include ($_SERVER["DOCUMENT_ROOT"] . "/erreur404.php");
exit();
}
Cette fonction envoie les headers nécessaires au navigateur du visiteur et aux moteurs de recherche pour indiquer que la page n’existe pas avec le statut de page 404. Ensuite, on inclut la même page d’erreur 404 que nous avons crées pour les erreur normales gérée par .htaccess
. À noter qu’on utilise la variable globale $_SERVER["DOCUMENT_ROOT"]
dans la fonction include
pour pointer au fichier de façon absolue parce qu’une page d’erreur peut se situer n’importe où dans le site. Et on termine avec exit()
pour arrêter le programme de la page normale qui traite des cas où la variable a une valeur légitime.
De cette façon, on peut afficher notre page d’erreur 404 à des adresses fautives comme:
http://www.example.com/page.php?id=XYZ
Et offrir au visiteur diverses options de navigation pour qu’il trouve ce qu’il cherche dans votre site. Du trafic supplémentaire est toujours apprécié.
Assurez-vous d’avoir une page d’erreur assez bien remplie, sinon Internet Explorer (comme toujours, problématique) va afficher sa propre page d’erreur personnalisée dans le cas où la vôtre est trop petite (512 octets ou moins), et le visiteur pourrait ne jamais la voir.
Une petite note: il ne faut pas que la page erreur404.php
, par exemple (le nom est à votre choix), fasse elle-même appel au fichier de fonctions qui contient la fonction exit404()
, sinon il y aura le problème de déclarations doubles d’une fonction et l’affichage de votre page sera annulée. Si votre page page.php
inclue une page init.php
où se trouve la fonction exit404()
, il ne faut pas que erreur404.php
inclu aussi cette même page. Il vaut donc mieux placer la fonction exit404()
dans une autre page de fonctions que celle qui serait aussi inclue par erreur404.php
.
Bonjour, super le tutoriel c’est exactement ce que je cherchais pour mon site. J’ai un petit soucis par contre, c’est que j’inclus ce code dans ma page index.php pour les paramètres « index.php?page=1… » donc dans le code j’ai remplacé id par page mais la page index.php ne s’affiche plus… Le code fonctionne tres bien car quand je tape : index.php?page=test il y a le message d’erreur car ce n’est pas un chiffre et quand je tape index.php tout court l’erreur apparait aussi…