Le module mod_rewrite d’Apache n’étant pas disponible chez Free.fr voici comment faire en PHP.
La première modification porte sur le fichier .htaccess. Elle consiste à rediriger toutes les erreurs de type 404 vers un script PHP chargé de réécrire l’URL si elle est connue ou bien d’afficher une vraie erreur 404
ErrorDocument 404 /rewriteurl.php
Le code PHP récupére l’url demandée, la compare avec preg_match
à des URL connues. Si l’expression régulière concorde un header avec un code 200 est envoyé. Si necessaire les paramètres sont récupérés et passés au vrai script PHP par l’intermédiaire du tableau GET
. Ensuite le vrai script est inclu avant de terminer le script rewriteurl.php avec la commande exit()
. Si l’URL passée ne correspond à aucunes des expressions régulières alors une page de 404 est affichée.
<?php $url=$_SERVER['REQUEST_URI']; // On récupère l'adresse demandée /* Index */ if(preg_match("/\/articles\/?$/", $url, $match)) { header("HTTP/1.1 200 OK"); // On inclut la page index.php et on termine le script include("index.php"); exit(); } /* article */ else if(preg_match("/\/articles\/([0-9]+)\/?$/", $url, $match)) { header("HTTP/1.1 200 OK"); // Recuperation du paramètre, inclusion de la page index.php et on termine le script $_GET['st']=$match[1]; include("index.php"); exit(); } else if(preg_match("/\/articles\/([A-Za-z]+)\/?$/", $url, $match)) { header("HTTP/1.1 200 OK"); // Recuperation du paramètre, inclusion de la page article.php et on termine le script $_GET['perso']=$match[1]; include("article.php"); exit(); } else if(preg_match("/\/articles\/([A-Za-z]+)\/([0-9]+)\/?$/", $url, $match)) { header("HTTP/1.1 200 OK"); // Récupération des paramètres et inclusion la page article.php et on termine le script $_GET['perso']=$match[1]; $_GET['st']=$match[2]; include("article.php"); exit(); } /* Erreur 404 */ else { header("HTTP/1.1 404 Page Not Found"); print "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"; print "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"fr\" lang=\"fr\">\n"; print "<head>\n"; print "<title>Error 404 - Not found</title>\n"; print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n"; print "<meta http-equiv=\"cache-control\" content=\"no-cache\" />\n"; print "</head>\n"; print "<body style=\"font-family:arial;\">\n"; print "<h1 style=\"color:#0a328c;font-size:1.0em;\">Error 404 - Not found</h1>\n"; print "<p style=\"font-size:0.8em;\">Le fichier requis n'a pas été trouvé. Il peut s'agir d'une erreur technique. Veuillez réessayer ultérieurement. Si vous ne pouvez pas accéder au fichier après plusieurs tentatives, cela signifie qu'il a été supprimé\n"; print "</p>\n"; print "</body>\n"; print "</html>\n"; } ?>
Le probléme avec cette méthode c’est l’indexation. En effet le client reçoit un code 404 et ensuite un code 200 (il est facile de le vérifier avec FireFox et l’extension Live HTTP Headers ). Il y a fort à parier que les robots de crawl des moteurs de recherche s’arrête au 404.