Redirect 308: permanente, preserva il metodo

Il 308 Permanent Redirect è uno status HTTP di reindirizzamento permanente che richiede al client di ripetere la richiesta al nuovo URL con lo stesso metodo (POST, PUT, PATCH, ecc.) e lo stesso body. A differenza del 301, il browser non degrada il metodo a GET. I motori di ricerca trattano il 308 come redirect permanente: il valore dei link viene trasferito al nuovo URL e l'originale esce dall'indice.

Cos'è il redirect 308

Il 308 Permanent Redirect è un codice di stato HTTP standardizzato nella RFC 7538 (2015). Dice al client: «La risorsa richiesta si è spostata permanentemente a un nuovo URL. Ripeti la richiesta lì con lo stesso metodo e lo stesso body». La parola chiave è «permanentemente»: a differenza del 307, che è temporaneo, il 308 è permanente e segnala ai motori di ricerca di aggiornare l'indice e trasferire il valore dei link.

Il codice 308 colma una lacuna della specifica HTTP: prima della sua esistenza gli sviluppatori affrontavano un dilemma — il 301 è permanente ma i browser di fatto cambiano POST in GET; il 307 preserva il metodo ma solo per spostamenti temporanei. Il 308 combina la permanenza del 301 con la garanzia di preservazione del metodo del 307.

Regola pratica: 308 = «301, ma non toccare il metodo». 307 = «302, ma non toccare il metodo». Per gli spostamenti permanenti con preservazione del metodo usa il 308.

308 vs 301 vs 307 vs 302: differenze chiave

I quattro codici di redirect differiscono lungo due assi: permanenza e preservazione del metodo HTTP.

  • 301 Moved Permanently — redirect permanente, trasferisce il valore dei link. Il metodo dovrebbe tecnicamente essere preservato, ma i browser degradano POST→GET (comportamento ereditato da HTTP/1.0).
  • 302 Found (temporaneo) — redirect temporaneo, nessun trasferimento di valore. Il metodo è di fatto cambiato POST→GET nella maggior parte dei browser.
  • 307 Temporary Redirect — redirect temporaneo, nessun trasferimento di valore. Il metodo è rigorosamente preservato (POST resta POST).
  • 308 Permanent Redirect — redirect permanente, trasferisce il valore dei link. Il metodo è rigorosamente preservato. L'equivalente del 301 amico di API e form.
Il 308 è supportato da tutti i browser moderni (Chrome 36+, Firefox 18+, Edge, Safari 7.1+), ma alcuni client HTTP legacy e alcuni proxy non lo riconoscono. Per la massima compatibilità negli ambienti legacy usa invece il 307 (temporaneo) o il 301 (permanente).

Quando usare il 308

  • Migrazione permanente di endpoint API: quando i client inviano PUT/PATCH/DELETE e devi spostare definitivamente l'endpoint a un nuovo indirizzo senza perdere il body della richiesta.
  • Cambio permanente dell'URL di un form: quando cambi definitivamente l'indirizzo di un form di registrazione o di checkout, preservando i dati POST.
  • Upgrade di versione dell'API: migrazione da /api/v1/ a /api/v2/ quando la vecchia versione viene ritirata definitivamente, preservando il metodo della richiesta.
  • Upgrade a HTTPS per endpoint POST: quando sposti permanentemente form e API da HTTP a HTTPS dove preservare metodo e body della richiesta è critico.
  • Ristrutturazione delle route dell'applicazione: quando sposti permanentemente i gestori dei form a una nuova struttura dentro l'applicazione.
Non usare il 308 per spostamenti temporanei: segnala permanenza. I browser mettono in cache i redirect 308 e non richiederanno più il vecchio URL. Per le situazioni temporanee usa il 307.

Redirect 308 e SEO

Dal punto di vista dei motori di ricerca, il 308 è un redirect permanente equivalente al 301. Google e Bing trasferiscono il valore dei link (PageRank) attraverso il 308: l'URL originale esce dall'indice e la destinazione riceve l'autorità dell'URL di partenza. Il comportamento dei crawler per il 308 è identico al 301: Googlebot segue il redirect e aggiorna l'indice di conseguenza.

Nella pratica la differenza SEO tra 301 e 308 è trascurabile: entrambi trasferiscono valore ed entrambi sono permanenti. La scelta conta solo nel contesto di API e form: se l'applicazione usa richieste POST/PUT/PATCH e il metodo è critico, il 308 è preferibile. Per le normali pagine HTML con richieste GET usa il buon vecchio 301.

Se vedi un 308 in un audit SEO su pagine normali, non è un errore SEO, ma può indicare over-engineering. Il 308 è giustificato solo dove preservare il metodo della richiesta HTTP conta.

Come configurare il redirect 308

Esempi per gli ambienti server più comuni:

nginx
# Nginx: permanent redirect with method preservation
server {
    listen 80;
    server_name example.com;

    # All HTTP traffic → HTTPS (308 preserves POST body and is permanent)
    return 308 https://example.com$request_uri;
}

# Permanent API endpoint migration
location /api/v1/ {
    return 308 https://example.com/api/v2/;
}
apache
# Apache (.htaccess)
# Permanent redirect for a single URL with method preservation
Redirect 308 /old-endpoint https://example.com/new-endpoint

# or via mod_rewrite
RewriteEngine On
RewriteRule ^api/v1/(.*)$ https://example.com/api/v2/$1 [R=308,L]
javascript
// Next.js — permanent redirect with exact 308 status
// Note: permanent: true uses 301 — use middleware for exact 308:
import { NextResponse } from 'next/server';

export function middleware(request) {
  if (request.nextUrl.pathname.startsWith('/api/v1/')) {
    const newUrl = request.nextUrl.clone();
    newUrl.pathname = newUrl.pathname.replace('/api/v1/', '/api/v2/');
    return NextResponse.redirect(newUrl, { status: 308 });
  }
}
php
<?php
// PHP: explicit 308
http_response_code(308);
header('Location: https://example.com/new-endpoint');
exit();
?>
bash
# Verify via curl — confirm the response is exactly 308
curl -I -X POST https://example.com/old-endpoint
# HTTP/2 308
# location: https://example.com/new-endpoint

FAQ

Qual è la differenza principale tra 308 e 301?
Entrambi permanenti ed entrambi trasferiscono il valore dei link. La differenza sta nella gestione del metodo: il 301 di fatto cambia POST in GET nella maggior parte dei browser, il 308 lo preserva rigorosamente. Per le pagine GET la distinzione è irrilevante; per form POST e API è critica.
Un redirect 308 trasferisce il valore dei link?
Sì. Il 308 è permanente, come il 301. I motori di ricerca trasferiscono il PageRank al nuovo URL e rimuovono l'originale dall'indice. Dal punto di vista SEO il comportamento è identico al 301.
Quando devo usare 308 e quando 307?
Usa il 308 per spostamenti permanenti (migrazione API, upgrade di versione degli endpoint). Usa il 307 per spostamenti temporanei (failover, test A/B, manutenzione). Se lo spostamento è permanente e il metodo conta, usa il 308. Se è temporaneo, il 307.
I crawler dei motori di ricerca supportano il 308?
Sì. Googlebot e Bingbot gestiscono correttamente il 308, trasferiscono il valore dei link e aggiornano l'indice come per il 301. Se noti un ritardo nella re-indicizzazione è normale: il processo richiede da pochi giorni a diverse settimane.
Come verifico che il server restituisca 308 e non 301?
Esegui curl -I -X POST <URL> e guarda la riga di stato. Nel browser: DevTools → Network → trova la richiesta al vecchio URL → colonna Status. Anche Screaming Frog mostra i codici di redirect durante la scansione.