Cos'è il 410 Gone
Il 410 Gone è uno status HTTP del gruppo 4xx (errori client) che il server restituisce quando una risorsa richiesta è stata eliminata deliberatamente e in modo permanente. Il punto chiave: il server conosce questa route. Non è «pagina non trovata» ma «la pagina esisteva, è stata rimossa deliberatamente e non tornerà». È esattamente questo che distingue il 410 dal 404.
Secondo la RFC 9110, il 410 indica che la risorsa non è più disponibile e che questa condizione è probabilmente permanente. I motori di ricerca trattano il 410 come segnale univoco di de-indicizzare la pagina: senza controlli ripetuti né attese.
410 vs 404: la differenza
Entrambi i codici significano che all'URL richiesto non c'è pagina. La differenza sta in che cosa il server comunica sul motivo:
- 404 Not Found: risorsa non trovata. Il server non sa se esisteva prima o se tornerà. Il crawler ricontrollerà periodicamente l'URL, per prudenza.
- 410 Gone: il server conferma esplicitamente — la risorsa esisteva, è stata eliminata intenzionalmente e la cosa è permanente. Il crawler smette di ricontrollare e de-indicizza la pagina più in fretta.
Nella pratica il 404 indica quasi sempre anch'esso una cancellazione, ma il motore di ricerca non lo sa. Il 410 elimina l'ambiguità: il server comunica esplicitamente il fatto e la causa dell'assenza del contenuto.
410 o 301: che cosa scegliere
È la domanda più comune quando si eliminano pagine. La scelta dipende dall'esistenza di un'alternativa adatta per il redirect:
- Usa il 301 se la pagina si è spostata o esiste un'alternativa tematicamente pertinente. Un 301 trasferisce al nuovo URL il valore dei link accumulato, preservando posizioni e traffico.
- Usa il 410 se la pagina è eliminata definitivamente e non esiste un'alternativa adeguata. Reindirizzare a un URL irrilevante (per esempio la homepage) solo per conservare il valore è una cattiva pratica. Google lo capisce e non accredita quel valore.
- Usa il 404 se non sei certo dell'intento o se la pagina potrebbe teoricamente tornare.
Quando usare il 410
Il 410 è la scelta giusta nelle seguenti situazioni:
- Eliminazione di prodotti a catalogo senza alternative e che non torneranno disponibili.
- Depubblicazione di articoli, news o pagine promo scadute.
- Rimozione di contenuti generati dagli utenti (profili, post) su richiesta dell'utente o per GDPR.
- Pulizia di pagine spam o duplicate che non devono più essere indicizzate.
- Eliminazione di sezioni durante la ristrutturazione del sito quando le pagine non hanno alternative tematiche vicine.
- Disattivazione di endpoint API di vecchie versioni non più supportate.
Serve una pagina personalizzata per il 410
Il 410 è innanzitutto un segnale per i crawler di ricerca, non per gli utenti. Ma se un utente reale atterra su un URL del genere (per esempio da un vecchio bookmark o da un link esterno), vedrà una risposta vuota o un errore nudo del browser, senza il tuo brand.
Raccomandazioni per il template della pagina 410:
- Per le risorse tecniche (API, endpoint interni) non serve template: basta il codice di stato.
- Per le pagine rivolte agli utenti aggiungi un template minimo: spiega che la pagina è stata eliminata e offri un link alla homepage o alla ricerca interna. Puoi riutilizzare il template della pagina 404.
- Non reindirizzare dal 410 al 404. Restituisci 410 con un tuo HTML: è semanticamente corretto.
Come configurare il 410
Esempi per le piattaforme più diffuse:
# Apache — .htaccess
# Single specific URL:
Redirect 410 /old-promo
# Multiple URLs at once:
Redirect 410 /news/2021/event
Redirect 410 /sale/black-friday-2022
# All pages in a section:
RewriteEngine On
RewriteRule ^old-blog/.*$ - [G,L]# Nginx
server {
# Single URL:
location = /old-promo {
return 410;
}
# All pages in a section:
location ^~ /old-blog/ {
return 410;
}
}// Next.js — middleware.ts (precise 410 for specific URLs)
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
const GONE_PATHS = new Set([
'/old-promo',
'/news/2021/event',
'/sale/black-friday-2022',
]);
export function middleware(request: NextRequest) {
const pathname = request.nextUrl.pathname;
if (GONE_PATHS.has(pathname)) {
return new NextResponse('Gone', { status: 410 });
}
}
export const config = {
matcher: ['/old-promo', '/news/:path*', '/sale/:path*'],
};<?php
// PHP — explicit 410 with page body
http_response_code(410);
header('Content-Type: text/html; charset=UTF-8');
?>
<!DOCTYPE html>
<html lang="en">
<head><title>Page Gone</title></head>
<body>
<h1>410 Gone</h1>
<p>This page has been permanently deleted and no longer exists.</p>
<a href="/">Back to homepage</a>
</body>
</html>Dopo la configurazione, verifica lo status con Google Search Console (Controllo URL) oppure con curl:
curl -o /dev/null -s -w "%{http_code}\n" https://example.com/old-promo
# Expected output: 410