410 Gone
Permanent removal of a previously available resource is signaled by the 410 Gone status code. Unlike 404, a 410 confirms the resource once existed and has been intentionally deleted with no expectation of return.
Usage
When the 410 Gone error message is received, the client knows the address was valid at one point, but the resource no longer exists. This is the response returned after a resource, such as a document available as part of a limited-time offer, expires. If the server does not expect the removal to be permanent, 404 is used instead.
This status code is helpful for web maintenance and signals to clients to remove links to the resource. The response is cacheable by default. Clients and intermediaries store the 410 without explicit Cache-Control directives. Well-behaved clients do not retry the request, unlike 404 where a later retry may succeed.
Common use cases include expired promotions, deprecated API endpoints, and archived content permanently removed.
Example
The client requests a resource and the server responds with 410 Gone because the promotion has ended and the content is no longer available.
Request
GET /holiday-promotion-Jan-2021.pdf HTTP/1.1
Host: www.example.re
Response
HTTP/1.1 410 Gone
Content-Type: text/html
Content-Length: 133
<html>
<head>
<title>Promotion Expired</title>
</head>
<body>
<p>The promotional period has ended.</p>
</body>
</html>
410 vs 404
Both codes remove an address from search results and tell a client the resource is unavailable. 410 Gone adds a claim 404 never makes.
410 asserts three things: the resource existed, the removal was intentional, and no replacement follows. The response is a decision rather than an observation, so producing one calls for application knowledge about the address rather than a default handler.
404 stays deliberately silent about the future. A temporary outage, an accidental deletion, and a mistyped address all yield the same answer, and the response commits to nothing. A server with no record of the address has no basis for anything stronger.
Search engines drop both from the index at the same rate, treating the two codes identically, and crawling of a removed address tapers off once the code registers, so neither code drains crawl budget. Neither passes ranking signals onward, so an address holding backlinks or traffic is better redirected with 301 to a successor than removed with either code.
Deleted user accounts, expired listings, and retired products with no equivalent are the cases where 410 is accurate. Everything else is a 404.
How to fix
When a 410 appears unexpectedly, check the server
configuration files for unintended rules. In Apache,
search httpd.conf and .htaccess for RewriteRule
entries with the [G] (Gone) flag or Redirect gone
directives. In nginx, look for return 410 inside
location blocks in the server config. CMS plugins
and recent upgrades sometimes add 410 rules without
warning. Disable recently installed plugins to
isolate the source.
If the removal is intentional, update sitemaps to exclude the URL and remove internal links pointing to the resource.
In WordPress, plugins like Redirection or Yoast SEO manage 410 responses through the admin interface without editing server files directly.
If the removal is unintentional, restore the resource or its replacement and return 200. When a replacement page exists at a different URL, a 301 redirect is more appropriate than a 410.
Code references
.NET
HttpStatusCode.Gone
Rust
http::StatusCode::GONE
Rails
:gone
Go
http.StatusGone
Symfony
Response::HTTP_GONE
Python3.5+
http.HTTPStatus.GONE
Java
java.net.HttpURLConnection.HTTP_GONE
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_GONE
Angular
@angular/common/http/HttpStatusCode.Gone
See also
- RFC 9110: HTTP Semantics
- Google: HTTP status codes and network errors
- Soft 404
- 404
- HTTP status codes