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

Commencer la lecture
- Qu'est-ce que le code de statut HTTP 302 ?
- Anatomie d'une réponse 302
- Pourquoi obtenez-vous un code 302 au lieu de 200 ?
- 302 vs 301 vs 307 vs 308 : quelle redirection choisir ?
- Quand utiliser une redirection 302 ?
- Comment envoyer un code de statut 302
- Comment tester un code de statut 302
- Redirections 302 et SEO
- Pourquoi un 302 change les requêtes POST en GET
- Erreurs 302 courantes et comment les corriger
- Boucles de redirection 302 : comment diagnostiquer
- Bonnes pratiques pour le code de statut 302
- Comment les navigateurs et les outils gèrent un 302
- 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 simplementHTTP/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-ageouExpires; 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/1.1 302 Found
Location: https://www.example.com/login?next=%2Fdashboard
Content-Length: 0
Date: Mon, 26 Oct 2026 14:00:00 GMTLocation 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/settingsvous 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-ipour 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,returnde nginx suivi d'une simple URL etRedirectd'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 ?
| Code | Permanent ? | Un POST dans les navigateurs | En cache par défaut ? | Idéal pour |
|---|---|---|---|---|
| 301 Moved Permanently | Oui | Devient GET | Oui | Changements d'URL définitifs, changements de domaine |
| 302 Found | Non | Devient GET | Non | Connexions, déplacements de courte durée, tests A/B |
| 303 See Other | Non | Devient GET | Non | La page affichée après l'envoi d'un formulaire |
| 307 Temporary Redirect | Non | Reste POST | Non | Déplacements temporaires qui doivent garder la méthode |
| 308 Permanent Redirect | Oui | Reste POST | Oui | Dé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
/dashboardvers/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-fridayqui 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) :
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] :
# 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 :
// 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.
# 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).
# 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.comSi 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
Locationavant 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-ageouExpires, 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).
# 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 confirmedSi 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-ageniExpiresn'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
/loginrelatif évite de laisser fuiter un nom d'hôte interne ou unhttp://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 → Cajoute 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 :
| Client | Ce qu'il fait d'un 302 | Limite de redirections |
|---|---|---|
| Chrome, Edge, Firefox, Safari | Le suit aussitôt ; un POST devient un GET | 20 (Fetch Standard) |
| fetch() en JavaScript | Le suit par défaut (redirect: "follow") ; même règle pour POST | 20 |
| curl | Ne 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 -L | Le suit ; un POST devient un GET sur 301, 302 et 303 (--post301, --post302, --post303 le conservent) | 50 (--max-redirs) |
| wget | Le suit | 20 (--max-redirect) |
| Python requests | Le suit ; toute méthode sauf HEAD devient un GET | 30 |
| Googlebot | Le suit ; garde l'URL source comme résultat de recherche | 10 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
- RFC 9110: HTTP Semantics, 302 Found, IETF
- Fetch Standard: HTTP-redirect fetch, WHATWG
- Redirects and Google Search, Google Search Central
- Configure cache by status code (default 20 minutes for 302), Cloudflare
Questions fréquentes
Que signifie le code HTTP 302 ?
Pourquoi est-ce que j'obtiens un 302 au lieu d'un 200 ?
« Erreur 302 » : est-ce vraiment une erreur ?
302 est-il meilleur que 301 ?
Une redirection 302 nuit-elle au SEO ?
Quelle est la différence entre 302 et 307 ?
Pourquoi ma requête POST devient-elle un GET après un 302 ?
Les redirections 302 sont-elles mises en cache par les navigateurs ?
Comment envoyer une redirection 302 ?
Comment vérifier si une URL renvoie un 302 ?
Articles associés
Outils associés
Vérificateur de Redirections
Vérifiez les redirections d'URL, les chaînes de redirection et les codes de statut HTTP pour le SEO
Vérificateur d'en-têtes HTTP
Analysez les en-têtes de réponse HTTP et la notation des en-têtes de sécurité
Vérification du Certificat SSL
Vérifiez la validité et les détails de sécurité du certificat SSL
Recherche DNS
Tous les enregistrements DNS depuis les serveurs du domaine, à côté du cache de Google et Cloudflare



