Erreur 302 (code HTTP 302 Found) : signification et causes

Point clé

Le code HTTP 302 Found est une redirection temporaire, pas une erreur : le serveur indique que la page se trouve pour le moment à une autre URL, donnée dans l'en-tête Location. Le navigateur charge aussitôt cette URL, tandis que les liens et les moteurs de recherche gardent l'URL d'origine. Pour un déplacement définitif, utilisez 301 ou 308 : sur 20 grands sites que nous avons vérifiés, aucun n'utilisait de 302 pour cela. On rencontre surtout un 302 quand une page exige une connexion. En suivant un 302, les navigateurs transforment un POST en GET : utilisez 307 pour conserver la méthode, ou 303 après un formulaire.

Vérifiez maintenant

Infographie du code de statut HTTP 302 montrant le flux de redirection temporaire avec en-tête Location et comparaison 301 vs 302 vs 307
Infographie du code de statut HTTP 302 montrant le flux de redirection temporaire avec en-tête Location et comparaison 301 vs 302 vs 307
Commencer la lecture
  1. Qu'est-ce que le code de statut HTTP 302 ?
  2. Anatomie d'une réponse 302
  3. Pourquoi obtenez-vous un code 302 au lieu de 200 ?
  4. 302 vs 301 vs 307 vs 308 : quelle redirection choisir ?
  5. Quand utiliser une redirection 302 ?
  6. Comment envoyer un code de statut 302
  7. Comment tester un code de statut 302
  8. Redirections 302 et SEO
  9. Pourquoi un 302 change les requêtes POST en GET
  10. Erreurs 302 courantes et comment les corriger
  11. Boucles de redirection 302 : comment diagnostiquer
  12. Bonnes pratiques pour le code de statut 302
  13. Comment les navigateurs et les outils gèrent un 302
  14. Questions fréquentes

Qu'est-ce que le code de statut HTTP 302 ?

HTTP 302 Found est une redirection temporaire. Le serveur répond « ce que vous demandez se trouve ailleurs pour le moment » et indique l'autre URL dans l'en-tête Location. Le navigateur charge aussitôt cette URL, mais les favoris, les liens et les moteurs de recherche doivent continuer d'utiliser l'URL d'origine (RFC 9110 §15.4.3).

Ce « pour le moment » fait toute la différence avec 301 Moved Permanently, qui signale que l'ancienne URL a disparu pour de bon. HTTP/1.0 appelait le 302 « Moved Temporarily » (RFC 1945) ; la RFC 2616 l'a renommé « Found » en 1999, sans en changer le sens.

En tant que visiteur, vous en voyez rarement un : le navigateur le suit avant que quoi que ce soit ne s'affiche. On le croise dans les DevTools, dans curl, dans les clients d'API et dans les audits SEO.

Voir chaque redirection et son code de statut

Anatomie d'une réponse 302

Une réponse 302 est courte. Voici ses éléments :

  • Ligne de statut — HTTP/1.1 302 Found, ou simplement HTTP/2 302 (HTTP/2 ne transmet pas de libellé comme « Found »)
  • Location — l'URL où aller. La RFC 9110 dit que le serveur DEVRAIT (SHOULD) l'envoyer ; sans elle, le navigateur ne sait pas où aller et affiche le corps du 302 lui-même, généralement vide
  • Corps — selon la RFC 9110, il « contient généralement une courte note hypertexte » avec un lien. Les navigateurs l'ignorent ; nginx, Apache et Express envoient par défaut une note d'une ligne, tandis que beaucoup de grands sites envoient un corps vide
  • En-têtes de cache — inutiles. Les navigateurs ne mettent pas un 302 en cache, sauf si vous ajoutez Cache-Control: max-age ou Expires ; les 301 et 308, eux, sont mis en cache par défaut. Un CDN peut tout de même le garder en cache (voir « Un 302 qui persiste » plus bas)
http
HTTP/1.1 302 Found
Location: https://www.example.com/login?next=%2Fdashboard
Content-Length: 0
Date: Mon, 26 Oct 2026 14:00:00 GMT

Location peut être une URL complète ou un chemin relatif comme /login : la RFC 9110 autorise toute référence d'URI, et les navigateurs la résolvent par rapport à l'URL demandée. Dans le code d'une application (Express, par exemple), un chemin relatif évite qu'un nom d'hôte interne ou un http:// ne fuite quand l'application tourne derrière un proxy ; nginx et Apache le transforment de toute façon en URL absolue, sauf si vous définissez absolute_redirect off ou RedirectRelative On.

Pourquoi obtenez-vous un code 302 au lieu de 200 ?

Parce que la page attend quelque chose que votre requête n'apporte pas, ou que l'URL utilisée n'est pas celle que le site sert. Les raisons habituelles :

  • Vous n'êtes pas connecté — les pages réservées aux utilisateurs connectés répondent par un 302 vers la page de connexion, avec la page demandée dans un paramètre de retour. Sans être connecté, github.com/settings vous envoie vers /login?return_to=…. Dans curl ou un client d'API, envoyez le cookie de session ou le jeton.
  • Votre client ne suit pas les redirections — les navigateurs, fetch() et la bibliothèque requests de Python les suivent automatiquement. curl ne le fait pas sans -L : il s'arrête au 302 et n'affiche que son corps, souvent vide (ajoutez -i pour voir le statut et Location).
  • L'URL n'est pas celle que le site sert — une barre oblique finale manquante ou en trop, un chemin de langue, ou un lien de suivi qui vous renvoie ailleurs. res.redirect() d'Express, return de nginx suivi d'une simple URL et Redirect d'Apache envoient tous un 302 si on ne leur indique pas un autre code.
  • Quelque chose devant le serveur l'ajoute — si l'origine répond 200 quand vous la testez directement mais que l'URL publique renvoie un 302, c'est une règle de CDN, de load balancer ou de proxy qui redirige.

Les API répondent plutôt à une connexion manquante par un 401 Unauthorized que par une redirection. Pour voir chaque saut et son code de statut, passez l'URL dans le Vérificateur de redirections.

302 vs 301 vs 307 vs 308 : quelle redirection choisir ?

Cinq codes de redirection couvrent presque tous les cas. Ils se distinguent sur deux points : le déplacement est-il permanent, et un POST reste-t-il un POST ?

CodePermanent ?Un POST dans les navigateursEn cache par défaut ?Idéal pour
301 Moved PermanentlyOuiDevient GETOuiChangements d'URL définitifs, changements de domaine
302 FoundNonDevient GETNonConnexions, déplacements de courte durée, tests A/B
303 See OtherNonDevient GETNonLa page affichée après l'envoi d'un formulaire
307 Temporary RedirectNonReste POSTNonDéplacements temporaires qui doivent garder la méthode
308 Permanent RedirectOuiReste POSTOuiDéplacements définitifs qui doivent garder la méthode

Les codes 303 et 307 existent à cause du 302. HTTP/1.1 a ajouté le 303 en 1997, puis, en 1999, la RFC 2616 a reconnu que « la plupart des agents utilisateurs existants traitent le 302 comme s'il s'agissait d'une réponse 303 », a ajouté le 307 et renommé le 302 « Found » (RFC 2616 §10.3.3). Si une redirection temporaire peut recevoir un POST, utilisez 307 pour le conserver, ou 303 pour charger la page suivante en GET.

Quand utiliser une redirection 302 ?

Utilisez un 302 quand vous prévoyez que la redirection disparaîtra. Cas typiques :

  • Redirections de connexion — envoyer un utilisateur non connecté de /dashboard vers /login, puis l'y ramener après la connexion
  • Tests A/B — envoyer une partie des visiteurs vers une variante ; les conseils de Google sur les tests recommandent justement un 302, et non un 301 (Google Search Central)
  • Pages en travaux — envoyer les visiteurs vers une page d'information pendant les quelques jours où une page est refaite
  • URL de campagne éphémères — /black-friday qui pointe vers la page de l'opération de l'année, uniquement pendant l'opération
  • Maintenance — pour les visiteurs seulement ; pour les moteurs de recherche, un 503 avec Retry-After est la meilleure réponse pendant une interruption planifiée

Si l'un de ces cas devient permanent, passez au 301.

Comment envoyer un code de statut 302

La plupart des serveurs et des frameworks permettent d'envoyer un 302 en une ligne. Chacun des exemples ci-dessous envoie 302 Found avec un en-tête Location, tout ce dont un 302 a besoin.

Nginx

Dans nginx, utilisez return avec le code. return suivi d'une simple URL envoie aussi un 302 (documentation nginx) :

nginx
server {
    listen 80;
    server_name example.com;

    # Temporary redirect (302 Found)
    location /old-page {
        return 302 https://example.com/new-page;
    }
}

Apache (.htaccess)

Sous Apache, utilisez Redirect (302 est sa valeur par défaut si vous n'indiquez aucun statut) ou une RewriteRule avec [R=302,L] :

apache
# Simple temporary redirect
Redirect 302 /old-page https://example.com/new-page

# Or with mod_rewrite for pattern matching
RewriteEngine On
RewriteRule ^maintenance$ /maintenance.html [R=302,L]

Node.js (Express)

res.redirect() d'Express envoie un 302 par défaut quand aucun code de statut n'est fourni :

javascript
// Temporary redirect (302 Found by default)
app.get('/dashboard', (req, res) => {
  if (!req.user) {
    return res.redirect('/login') // sends 302
  }
  // ...render dashboard
})

// Or be explicit:
res.redirect(302, '/login')

Comment tester un code de statut 302

Le plus rapide est curl dans un terminal : il affiche le code de statut et l'en-tête Location sans que le cache du navigateur s'en mêle.

bash
# Status and headers, without following the redirect
curl -sI https://example.com/old-page

# -I sends HEAD, which some servers answer differently; this sends a real GET
curl -s -o /dev/null -D - https://example.com/old-page

# Expected:
# HTTP/2 302
# location: https://example.com/new-page

# Follow the whole chain and print each hop's status and Location
curl -sL -o /dev/null -D - https://example.com/old-page | grep -iE '^(HTTP/|location:)'

Pas de terminal ? Le Vérificateur de redirections de DNS Robot suit chaque saut (301, 302, 303, 307, 308 et meta refresh) depuis notre serveur et affiche chaque code de statut et l'URL finale, et le Vérificateur d'en-têtes HTTP montre les en-têtes bruts de chaque saut dans l'onglet Redirections.

Redirections 302 et SEO

Google traite les deux types de redirection comme des instructions différentes. Pour une redirection temporaire (302, 303, 307), Googlebot suit la redirection, mais Google ne l'utilise pas comme un signal indiquant que la cible doit être l'URL canonique : la page source reste donc normalement dans les résultats de recherche. La cible peut tout de même être indexée si d'autres signaux pointent vers elle (Google Search Central).

Une redirection permanente (301, 308) dit l'inverse : affichez la nouvelle URL. La vraie question n'est donc pas « un 302 transmet-il le PageRank ? », mais « quelle URL est-ce que je veux voir dans les résultats de recherche ? ». Votre balise rel=canonical fait partie de ces autres signaux ; le Vérificateur de balises meta montre quelle URL une page déclare.

  • Utilisez 301 ou 308 pour les déplacements définitifs — nouveau domaine, nouvelle structure d'URL, pages fusionnées
  • Utilisez 302 pour les déplacements temporaires — connexions, tests A/B, campagnes
  • Ne laissez pas un déplacement définitif en 302 — Google peut continuer d'afficher l'ancienne URL
  • Gardez les chaînes courtes — chaque saut coûte un aller-retour, et Googlebot suit par défaut jusqu'à 10 sauts de redirection (Google)

Pourquoi un 302 change les requêtes POST en GET

C'est l'aspect le plus surprenant du 302. Les premières spécifications n'ont jamais autorisé les clients à changer de méthode, mais les navigateurs transformaient malgré tout un POST en GET sur un 302. Aujourd'hui, le Fetch Standard que les navigateurs implémentent consacre cette habitude : sur un 301 ou un 302, un POST devient un GET et son corps est abandonné (Fetch Standard).

Ainsi, quand un navigateur envoie POST /submit-form et que le serveur répond 302 Found, le navigateur enchaîne avec GET /thank-you, et les données du formulaire sont perdues. Les navigateurs gardent PUT et DELETE tels quels ; les autres clients varient : la bibliothèque requests de Python transforme toute méthode sauf HEAD en GET sur un 302, et curl -L transforme un POST en GET sur 301, 302 et 303 (--post302 conserve le POST sur un 302).

http
# What you send:
POST /submit-form HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded

name=Alice&email=alice@example.com

# Server responds with 302:
HTTP/1.1 302 Found
Location: /thank-you

# Browser follows with GET (form data dropped!):
GET /thank-you HTTP/1.1
Host: example.com

Si la redirection doit conserver la méthode d'origine (un POST reste un POST, un PUT reste un PUT), utilisez 307 Temporary Redirect. Si vous voulez volontairement abandonner le corps et passer en GET (le schéma classique POST/Redirect/GET), utilisez 303 See Other. Les deux sont sans ambiguïté ; 302 ne l'est pas.

Erreurs 302 courantes et comment les corriger

Quand un 302 pose problème, c'est généralement l'un de ces cas :

  • Un 302 au lieu d'un 200 — une page qui exige une connexion, un client qui ne suit pas les redirections ou une variante d'URL (voir « Pourquoi obtenez-vous un code 302 au lieu de 200 ? » plus haut)
  • Un 302 sans en-tête Location — rien ne peut le suivre, et le navigateur affiche le corps du 302 lui-même, généralement vide. Définissez Location avant d'envoyer le statut
  • Un 302 qui pointe sur lui-même — une boucle de redirection : la règle se déclenche sur sa propre cible. Ajoutez la condition manquante
  • Un formulaire qui perd ses données — POST → 302 → GET abandonne le corps. Utilisez 303 pour afficher volontairement une page de résultat, ou 307 pour conserver le POST
  • Un 302 qui persiste — le serveur l'a envoyé avec Cache-Control: max-age ou Expires, si bien que les navigateurs l'ont mis en cache, ou c'est votre CDN qui l'a mis en cache (sur le contenu que Cloudflare met en cache, il garde un 302 pendant 20 minutes, sauf indication contraire des en-têtes ; documentation Cloudflare). Supprimez ces en-têtes, purgez le CDN et videz le cache du navigateur
  • Un 302 en production mais pas en local — souvent une règle de CDN, de load balancer ou de proxy qui ajoute des redirections. Testez directement l'origine pour en avoir le cœur net

Boucles de redirection 302 : comment diagnostiquer

Une boucle de redirection, c'est une URL A qui vous envoie vers B, et B qui vous renvoie vers A. Après 20 redirections, la limite fixée par le Fetch Standard, Chrome abandonne avec ERR_TOO_MANY_REDIRECTS et Firefox avec « La page n’est pas redirigée correctement ».

Une cause classique est le mode de chiffrement Flexible de Cloudflare : Cloudflare contacte votre serveur en HTTP simple, votre serveur redirige HTTP vers HTTPS, et Cloudflare redemande en HTTP (documentation Cloudflare).

bash
# Trace the full redirect chain (limit to 10 hops to avoid infinite loops)
curl -ILs --max-redirs 10 https://example.com 2>&1 | grep -i 'HTTP/\|location:'

# Example of a loop:
# HTTP/2 302
# location: http://example.com/
# HTTP/1.1 302 Found
# Location: https://example.com/
# HTTP/2 302
# location: http://example.com/  <-- loop confirmed

Si la même URL revient sans cesse dans Location, qu'elle pointe sur elle-même ou que deux URL alternent, vous avez une boucle (avec le mode Flexible de Cloudflare, https://example.com/ redirige vers elle-même). Pour la solution complète, consultez notre guide ERR_TOO_MANY_REDIRECTS. Le Vérificateur de redirections de DNS Robot trace la chaîne depuis notre serveur et s'arrête là où elle boucle.

Bonnes pratiques pour le code de statut 302

Quelques habitudes évitent la plupart des problèmes de 302 :

  • Envoyez toujours un en-tête Location — sans lui, rien ne suit la redirection
  • N'ajoutez pas d'en-têtes de cache — un 302 sans max-age ni Expires n'est pas mis en cache, et c'est ce que vous voulez
  • Attention aux URL absolues derrière un proxy — dans le code d'une application, un /login relatif évite de laisser fuiter un nom d'hôte interne ou un http:// dans Location ; nginx et Apache construisent les URL absolues à partir de leurs propres réglages
  • Limitez-vous à un saut — A → B, c'est bien ; A → B → C ajoute un aller-retour pour chaque visiteur
  • Ne redirigez jamais un POST vers une autre page avec un 302 — utilisez 303 pour afficher une page de résultat, ou 307 pour conserver le POST
  • Passez en revue les anciennes redirections temporaires — elles survivent souvent à leur raison d'être. Vérifiez-les avec le Vérificateur de redirections
  • Passez au 301 dès qu'un déplacement devient définitif

Comment les navigateurs et les outils gèrent un 302

Les clients s'accordent pour suivre un 302, mais diffèrent sur les limites et sur ce que devient la méthode :

ClientCe qu'il fait d'un 302Limite de redirections
Chrome, Edge, Firefox, SafariLe suit aussitôt ; un POST devient un GET20 (Fetch Standard)
fetch() en JavaScriptLe suit par défaut (redirect: "follow") ; même règle pour POST20
curlNe le suit pas ; affiche seulement le corps du 302, souvent vide (ajoutez -i ou -I pour voir le statut et Location)Aucune (pas de suivi)
curl -LLe suit ; un POST devient un GET sur 301, 302 et 303 (--post301, --post302, --post303 le conservent)50 (--max-redirs)
wgetLe suit20 (--max-redirect)
Python requestsLe suit ; toute méthode sauf HEAD devient un GET30
GooglebotLe suit ; garde l'URL source comme résultat de recherche10 sauts par défaut

Pour le texte exact, consultez la définition du 302 dans la RFC 9110 et la page de MDN sur le 302.

Tracez n'importe quelle chaîne de redirection en quelques secondes

Utilisez le Vérificateur de redirections gratuit de DNS Robot pour inspecter chaque saut d'une chaîne de redirection : codes de statut, en-têtes Location et destination finale, vus depuis un serveur neutre (sans le cache du navigateur).

Sources

  1. RFC 9110: HTTP Semantics, 302 Found, IETF
  2. Fetch Standard: HTTP-redirect fetch, WHATWG
  3. Redirects and Google Search, Google Search Central
  4. Configure cache by status code (default 20 minutes for 302), Cloudflare

Questions fréquentes

Que signifie le code HTTP 302 ?

HTTP 302 Found est une redirection temporaire : la ressource se trouve pour le moment à une autre URL, indiquée dans l'en-tête Location de la réponse. Le navigateur la suit aussitôt, mais les liens, les favoris et les moteurs de recherche doivent continuer d'utiliser l'URL d'origine. Son équivalent permanent est 301 Moved Permanently.

Pourquoi est-ce que j'obtiens un 302 au lieu d'un 200 ?

Le plus souvent parce que la page exige une connexion (elle vous redirige vers la page de connexion), que votre client ne suit pas les redirections (curl a besoin de -L), que l'URL n'est pas exactement celle que le site sert (une barre oblique finale ou un chemin de langue), ou qu'une règle de CDN ou de proxy placée devant le serveur ajoute une redirection. Un vérificateur de redirections montre chaque saut et son statut.

« Erreur 302 » : est-ce vraiment une erreur ?

Non. Les codes 3xx sont des redirections ; les erreurs sont les codes 4xx (côté client) et 5xx (côté serveur), selon la RFC 9110. Un 302 indique seulement que la page se trouve ailleurs pour le moment. On parle d'« erreur 302 » quand la redirection n'aboutit pas : la page exige une connexion, l'outil ne suit pas les redirections (curl sans -L), la réponse n'a pas d'en-tête Location, ou la redirection tourne en boucle. Dans ce dernier cas, Chrome affiche ERR_TOO_MANY_REDIRECTS et, en Python, urllib lève « HTTP Error 302: The HTTP server returned a redirect error that would lead to an infinite loop ». Le Vérificateur de redirections montre à quel saut la chaîne casse.

302 est-il meilleur que 301 ?

Aucun n'est meilleur : ils disent des choses différentes. Utilisez 301 (ou 308) quand une page a déménagé pour de bon et que vous voulez que les moteurs de recherche affichent la nouvelle URL. Utilisez 302 quand le déplacement est temporaire et que l'URL d'origine doit rester dans les résultats de recherche, par exemple pour les redirections de connexion, les tests A/B et les campagnes.

Une redirection 302 nuit-elle au SEO ?

Pas quand le déplacement est réellement temporaire. Google suit un 302, mais ne le considère pas comme un signal indiquant que la cible doit être canonique : l'URL d'origine reste donc normalement dans les résultats de recherche. Il ne nuit que si vous l'utilisez pour un déplacement définitif : Google peut alors continuer d'afficher l'ancienne URL au lieu de la nouvelle.

Quelle est la différence entre 302 et 307 ?

Les deux sont des redirections temporaires. En suivant un 302, les navigateurs transforment un POST en GET et abandonnent le corps ; un 307 conserve la méthode et le corps, donc un POST reste un POST. Utilisez 307 chaque fois qu'une redirection temporaire peut recevoir l'envoi d'un formulaire ou un appel d'API autre qu'un GET.

Pourquoi ma requête POST devient-elle un GET après un 302 ?

Les navigateurs le font depuis les années 1990, et le Fetch Standard l'exige désormais : sur un 301 ou un 302, un POST est renvoyé sous forme de GET, sans son corps. Renvoyez 307 Temporary Redirect pour conserver le POST, ou 303 See Other si vous voulez volontairement le GET, comme dans le schéma post/redirect/get après un formulaire.

Les redirections 302 sont-elles mises en cache par les navigateurs ?

Pas par défaut. Selon la RFC 9110, un 302 ne peut être mis en cache qu'avec une durée de fraîcheur explicite : les navigateurs n'en mettent un en cache que si le serveur ajoute Cache-Control: max-age ou Expires. Un CDN peut faire autrement : sur le contenu qu'il met en cache, Cloudflare garde un 302 pendant 20 minutes, sauf indication contraire des en-têtes. Les 301 et 308 sont l'inverse : les navigateurs les mettent en cache sauf instruction contraire.

Comment envoyer une redirection 302 ?

Envoyez la ligne de statut HTTP/1.1 302 Found et un en-tête Location contenant la nouvelle URL. Dans nginx : return 302 https://example.com/new-page; Dans Apache : Redirect 302 /old https://example.com/new. Dans Express : res.redirect('/new'), qui envoie un 302 par défaut.

Comment vérifier si une URL renvoie un 302 ?

Lancez curl -sI https://example.com/votre-url dans un terminal : il affiche le code de statut et l'en-tête Location sans suivre la redirection. Sans terminal, collez l'URL dans le Vérificateur de redirections gratuit de DNS Robot, qui suit chaque saut et affiche chaque code de statut ainsi que l'URL finale.

À propos de l’auteur

Shaik Vahid

Fondateur de DNS Robot. Vahid a passé des années au support d’hébergement web à réparer les domaines, les enregistrements DNS, les certificats SSL et la distribution des e-mails de clients. Il développe les outils de DNS Robot et écrit ces guides à partir des erreurs que les gens rencontrent vraiment.

Vérificateur de Redirections

Vérifiez les redirections d'URL, les chaînes de redirection et les codes de statut HTTP pour le SEO