Cos'e HTTP 302 Found
Il codice HTTP 302 Found indica che la risorsa risiede temporaneamente a un'URL diverso, fornito nell'header Location. A differenza del 301 (permanente), il 302 segnala che lo spostamento e provvisorio e che il client deve continuare a usare l'URL originale per le richieste future.
Storia e confusione semantica
Nella RFC 1945 (HTTP/1.0) il codice 302 era chiamato "Moved Temporarily". Nella RFC 7231 e stato rinominato "Found", più generico. Soprattutto, c'e stata confusione storica sul fatto che il client potesse cambiare il metodo HTTP da POST a GET seguendo un 302: la pratica e diventata convenzione anche se contraria allo standard originale. Per chiarire, sono stati introdotti il 303 See Other (forza GET) e il 307 Temporary Redirect (preserva metodo).
Differenze chiave 301 vs 302
| Aspetto | 301 | 302 |
|---|---|---|
| Durata | Permanente | Temporaneo |
| SEO ranking | Trasferito alla nuova URL | Mantenuto sulla vecchia URL |
| Browser cache | Aggressiva, anche indefinita | Solo se header lo permettono |
| Indicizzazione | Vecchia URL rimossa | Vecchia URL mantenuta |
| Metodo HTTP | Puo cambiare da POST a GET | Puo cambiare da POST a GET |
Quando usare il 302
- Manutenzione temporanea: reindirizza verso una pagina "lavori in corso".
- A/B testing: instrada utenti su varianti diverse senza alterare ranking.
- Geolocalizzazione provvisoria: redirect su versione locale ma volendo testare.
- Promozioni temporanee: landing page valide solo per un periodo.
- Autenticazione: redirect verso login dopo accesso a risorsa protetta.
Quando NON usare il 302
Errori comuni e dannosi:
- Migrazione di dominio permanente (usa 301).
- Passaggio HTTP -> HTTPS (usa 301).
- Consolidamento di pagine duplicate (usa 301).
- Cambio struttura URL definitivo (usa 301).
Usare 302 invece di 301 in questi casi disperde link juice e ritarda la corretta indicizzazione su Google.
Esempio Apache
RewriteEngine On
# Redirect temporaneo verso pagina manutenzione
RewriteCond %{REQUEST_URI} !^/manutenzione\.html$
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.10$
RewriteRule ^(.*)$ /manutenzione.html [R=302,L]
Esempio Nginx
location /old-page {
return 302 /new-page;
}
302 in framework moderni
La maggior parte dei framework utilizza il 302 come default per i redirect:
- Laravel:
return redirect('/new')emette 302. - Django:
HttpResponseRedirectemette 302. - Express.js:
res.redirect('/new')emette 302. - Spring:
RedirectViewdefault 302.
Per forzare 301 occorre passare lo status esplicito: res.redirect(301, '/new').
Behavior con POST
Storicamente i browser convertivano POST in GET dopo un 302, comportamento utile ma tecnicamente scorretto. Per affidarsi a preservare il metodo, usa il 307. Per forzare GET (es. pattern Post/Redirect/Get), usa 303.
Caching e header
Il 302 non e cacheable per default. Per renderlo cacheable serve Cache-Control: max-age=... o Expires:. Anche così, i browser sono conservativi rispetto al 301.
Diagnostica
Per ispezionare un redirect 302:
curl -I https://example.com/old-page
HTTP/1.1 302 Found
Location: https://example.com/new-page
Con -L curl segue il redirect automaticamente. Con -v visualizzi l'intera negoziazione.
302 e protocolli OAuth
Il flusso OAuth 2.0 usa intensamente i 302: il provider di identità reindirizza il browser tra authorize endpoint, login page, consent page e callback URL. Questi sono tutti redirect temporanei per design, perché dipendono dallo stato della sessione corrente. Usare 301 in OAuth e un'errore grave che puo creare problemi di cache e sicurezza.
302 per landing page geografiche
Servizi globali (e-commerce, news, SaaS) spesso usano 302 per redirezionare in base al paese: utente italiano -> /it/, utente americano -> /us/. Mantenendo 302 invece di 301, evitano che il browser cachi una scelta che potrebbe diventare scorretta (es. utente in viaggio).
302 dopo POST: il problema storico
HTTP/1.0 prevedeva che POST + 302 mantenesse POST nella nuova URL. I browser però convertivano in GET, contro lo standard. Per chiarezza la specifica e stata aggiornata in HTTP/1.1 introducendo 303 (GET forzato) e 307 (metodo preservato).
Debug 302 loop
Errori comuni: redirect loop tra HTTP e HTTPS, tra www e no-www, tra path con e senza trailing slash. Strumenti come Redirect Detective o curl con -L --max-redirs 10 mostrano la sequenza.
302 e session-based
Dopo il login, l'app fa 302 verso la pagina richiesta originariamente (deep linking). Questo NON deve essere 301 perché e contestuale alla sessione corrente. Implementazione: salvare l'URL desiderata in sessione prima del login, fare 302 verso di essa dopo l'auth.
Esempio Node.js Express
app.get('/old-page', (req, res) => {
res.redirect(302, '/new-page');
});
Default in Express e 302. Per 301 esplicito: res.redirect(301, '/new-page'). Per HTTP/HTTPS forzato, considerare middleware come express-sslify che usa 301.
302 e A/B testing
Le piattaforme di A/B testing (Optimizely, Google Optimize) usano 302 per dirottare temporaneamente utenti su variant diverse. Importante NON 301: il test e transitorio, il ranking deve rimanere sulla URL canonica.
302 vs canonical conflict
Se redirezioni A -> B con 302 ma A ha canonical su se stessa, Google riceve segnali contraddittori. Best practice: durante 302 attivo, anche canonical punta alla destinazione. Coerenza minimizza confusione SEO.
Tracking analytics
302 verso URL con parametri UTM diversi puo confondere analytics. Soluzione: passare i parametri originali via cookie o session prima del redirect, recuperarli dopo.
Hai bisogno di aiuto?
Se il tuo sito mostra errori HTTP, il team di G Tech Group puo aiutarti. Contattaci tramite il modulo di contatto.