HTTP 302 Found: differenza con 301

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

Aspetto301302
DurataPermanenteTemporaneo
SEO rankingTrasferito alla nuova URLMantenuto sulla vecchia URL
Browser cacheAggressiva, anche indefinitaSolo se header lo permettono
IndicizzazioneVecchia URL rimossaVecchia URL mantenuta
Metodo HTTPPuo cambiare da POST a GETPuo 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: HttpResponseRedirect emette 302.
  • Express.js: res.redirect('/new') emette 302.
  • Spring: RedirectView default 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.

Hai trovato utile quest'articolo?