Home > PHP > erreur 404, redirection 301: headers et codes de réponse HTTP courants

erreur 404, redirection 301: headers et codes de réponse HTTP courants

Lorsqu’on se connecte à une page Web, le client (navigateur) envoie une requête, auquel le serveur qui traite la réponse, en suivant le protocole HTTP, renvoie un code de traitement à 3 chiffres.
Ce code se situe sur la première ligne de la réponse, et est de la forme :

  1. HTTP/1.1 200 OK

. En php, la fonction php header() permet, depuis vos scripts, d’adapter le code que le serveur renvoie, afin de “forcer” le comportement du navigateur client.
Petit tour d’horizon des codes les plus répandus.

200 OK

Le code 200, c’est le Nirvana. Tout s’est bien passé, rien à signaler. C’est le code par défaut.

301 Moved Permanently (aka Redirect Permanent)

Le code 301 ou “redirection permanente” est très utilisé en référencement. Il signale au client (navigateur ou crawler de moteur de recherche) que la ressource demandée (document, image, etc) a été déplacée de manière définitive.
Imaginons que je renomme un dossier. En l’état, les moteurs de recherche enverront les internautes vers des pages qui n’existent plus (ils recevront donc une erreur 404 – document not found), et les éventuels liens entrants dont bénéficiaient mes pages sont perdus puisqu’ils pointent aussi dans le vide.
Avec une redirection permanente, les moteurs étant prévenus que le document a été déplacé, mettront leur index à jour pour envoyer les visiteurs directement sur la bonne URL. Dans le même temps, la popularité amenée par les liens entrant sera reportée sur les nouvelles pages.

302 Moved Temporarily

Proche de la Redirection 301, le code 302 indique qu’un document a été déplacé temporairement. Moteurs comme navigateurs téléchargeront donc le document à sa nouvelle adresse, mais les références futures se feront à l’URL habituelle.

304 Not Modified

Quand ils ont un document dans le cache, les navigateurs envoient un entête If-Modified-Since, qui comprend la date à laquelle ils ont téléchargé le document pour la dernière fois. Si le document n’a pas été modifié depuis, le serveur envoie un code de réponse 304, “non modifié”, afin que le navigateur évite de retélécharger un contenu qui est à jour dans son cache.

404 Not Found

Le document auquel l’utilisateur essaye d’accéder a été déplacé, supprimé, ou l’URL fournie est simplement incorrecte. Le serveur n’a donc rien à renvoyer. On peut configurer Apache, au niveau du Virtual Host (ou d’un .htaccess) pour qu’il renvoie, dans ce cas, un document précis, grâce à la directive ErrorDocument 404 /fichier.html . En cas d’erreur 404, c’est fichier.html qui sera servi. Cela peut (et devrait toujours) servir à envoyer une page 404 personnalisée, qui comprend au minimum un mini-plan du site, afin que l’internaute puisse continuer sa visite sur le site.

500 Internal Server Error

Le code 500, c’est la fin du monde. Le serveur n’a pas pu répondre à la requête, très souvent à cause d’une erreur de configuration. Donc, vérifiez d’abord votre .htaccess, il suffit d’un point-virgule qui traine pour que le serveur ne s’en sorte plus.

Fonction header

La fonction header() en PHP permet d’envoyer un code de réponse autre que le 200 habituel. Vu qu’elle modifie les entêtes, elle doit être utilisée AVANT qu’un caractère imprimable soit envoyé au client. Dans le cas contraire, un warning “headers already sent” sera généré. Voici, pour exemple, la syntaxe complète de l’utilisation de la fonction header() pour envoyer une redirection 301 propre:

  1. header("HTTP/1.1 301 Moved Permanently");
  2. header("Location: http://www.nouvelle-url.com/");

Ce post vous a été utile ? Re-Twittez le ! ReTwittez ce post

PHP , , , ,

  1. | #1

    Plutot que header(“HTTP/1.1 301 Moved Permanently”), je vous recommande plutot d’utiliser le troisième argument de header() : header(“Location: http://www.example.net/“, true, 301).

    Cette dernière syntaxe a le bon gout de passer quel que soit le serveur web et le mode de liaison entre le serveur et php.
    Sinon il faudrait s’assurer que la requête a bien été faite en HTTP 1.1 (sinon il faut laisser HTTP/1.0), qu’on n’a pas une interface CGI ou FastCGI (sinon c’est une entête “Status:” qu’il faut envoyer), et ainsi de suite.

  2. | #2

    J’ai écrit un bilet sur cette question le 3/9/2008 au sujet d’une migration de Free vers Ovh.

    -> http://www.dsfc.net/bloginfo/news/156/fr/migrer-un-site-wordpress-chez-free-vers-un-nouveau-domaine-.html

    Hasard ou nécessité ? ;+)

  3. bilbilou
    | #3

    Peut-on utiliser la fonction header(”HTTP/1.1 301 Moved Permanently”) dans un script php qui traite l’erreur 404 ?

  4. | #4

    @bilbilouOui sans problèmes mais il n’y a pas vraiment d’intéret à redirigé vers un fichier qui lui même redirigera vers un autre ?
    Mais techniquement c’est possible !

  1. | #1