410 Gone: page permanently deleted
What HTTP 410 is, how it differs from 404, when to choose 410 over 301, whether you need a custom page, and how to configure it on any server.
410 Gone is an HTTP response code returned when the server knows the route but the resource has been intentionally and permanently deleted. Unlike 404, 410 sends an explicit signal: the server is aware of this URL and confirms the content was deliberately removed and will never return. Search engines remove such pages from the index significantly faster.
What is 410 Gone
410 Gone is an HTTP status from the 4xx group (client errors) that the server returns when a requested resource has been intentionally and permanently deleted. The key point: the server knows about this route. This is not 'page not found' — it is 'the page existed, was deliberately removed, and will not come back'. That is exactly what distinguishes 410 from 404.
According to RFC 9110, 410 indicates that the resource is no longer available and that this condition is likely permanent. Search engines treat 410 as an unambiguous signal to deindex the page — without repeated checks or waiting.
410 vs 404: the difference
Both codes mean there is no page at the requested URL. The difference lies in what the server communicates about the reason:
- 404 Not Found: resource not found. The server does not know whether it existed before or will return. The crawler will periodically recheck the URL — just in case.
- 410 Gone: the server explicitly confirms — the resource existed, was intentionally deleted, and this is permanent. The crawler stops rechecking and deindexes the page faster.
In practice, 404 most often also means deletion, but the search engine does not know that. 410 removes the ambiguity: the server explicitly communicates the fact and reason for the missing content.
410 or 301: what to choose
This is the most common question when deleting pages. The choice depends on whether a suitable alternative exists for a redirect:
- Use 301 if the page has moved or a topically relevant alternative exists. A 301 passes the accumulated link equity to the new URL — preserving rankings and traffic.
- Use 410 if the page is permanently deleted and no suitable alternative exists. Redirecting to an irrelevant URL (e.g., the homepage) just to preserve link equity is bad practice. Google understands this and does not credit such equity.
- Use 404 if you are uncertain about the intent or the page might theoretically return.
When to use 410
410 is the right choice in the following situations:
- Deleting catalog products that have no alternatives and will not return to stock.
- Unpublishing articles, news, or promo pages with an expired shelf life.
- Removing user-generated content (profiles, posts) by user request or under GDPR.
- Cleaning up spam pages or duplicates that should no longer be indexed.
- Deleting sections during site restructuring when pages have no topically close alternative.
- Deactivating API endpoints for old versions that are no longer supported.
Do you need a custom page for 410
410 is primarily a signal for search crawlers, not for users. But if a real user lands on such a URL (e.g., from an old bookmark or an external link), they will see an empty response or a plain browser error without your branding.
Recommendations for a 410 page template:
- For technical resources (APIs, internal endpoints) — no template needed, the status code is sufficient.
- For user-facing pages — add a minimal template: explain that the page was deleted and provide a link to the homepage or site search. You can reuse the 404 page template.
- Do not redirect from 410 to 404. Return 410 with your own HTML — this is semantically correct.
How to configure 410
Examples for popular platforms:
# 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>After configuration, verify the status via Google Search Console (URL Inspection) or with curl:
curl -o /dev/null -s -w "%{http_code}\n" https://example.com/old-promo
# Expected output: 410Common questions
Discuss your project?
Share your goals and website context — I will suggest a practical next step.