410 Gone
使い方
410 Gone のエラーメッセージを受け取ったとき、クライアントはそのアドレスがかつては有効だったものの、リソースがもはや存在しないと認識します。これは、期間限定の提供の一部として利用できた文書などのリソースが期限切れになったあとに返されるレスポンスです。サーバーがその削除を恒久的なものと見込んでいない場合は、代わりに 404 が使われます。
このステータスコードは Web サイトの保守に役立ち、そのリソースへのリンクを削除するようクライアントに伝えます。このレスポンスはデフォルトでキャッシュ可能です。クライアントと中間装置は、明示的な Cache-Control ディレクティブがなくても 410 を保存します。あとで再試行すれば成功しうる 404 とは異なり、行儀のよいクライアントはリクエストを再試行しません。
一般的なユースケースには、期限切れのプロモーション、非推奨の API エンドポイント、恒久的に削除されたアーカイブコンテンツなどがあります。
SEO への影響
Google のような検索エンジンは、410 のレスポンスステータスを持つ URL をインデックスしません。以前にインデックスされていた URL は検索結果から削除されます。このコードを返すページはクロールバジェットを消費しません。Google は 404 と 410 をまったく同じように扱います。どちらも同じ速度でコンテンツをインデックスから削除します。410 で応答する代わりにエラーコンテンツを伴う 200 を返したり、削除された URL をホームページへリダイレクトしたりすると、ソフト 404 が生じ、クロールバジェットを浪費し、そのサイトのサーバーシグナルに対する信頼を損ないます。
例
クライアントがリソースを要求し、プロモーションが終了してコンテンツがもはや利用できないため、サーバーは 410 Gone で応答します。
リクエスト
GET /holiday-promotion-Jan-2021.pdf HTTP/1.1
Host: example.com
レスポンス
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 が予期せず現れた場合は、サーバーの設定ファイルに意図しないルールがないか確認します。Apache では、httpd.conf と .htaccess で [G](Gone)フラグを伴う RewriteRule のエントリや Redirect gone ディレクティブを探します。nginx では、サーバー設定の location ブロック内の return 410 を探します。CMS のプラグインや最近のアップグレードが、警告なく 410 のルールを追加することがあります。最近インストールしたプラグインを無効化して原因を切り分けます。
削除が意図的なものであれば、その URL を除外するようサイトマップを更新し、そのリソースを指す内部リンクを削除します。
WordPress では、Redirection や Yoast SEO といったプラグインが、サーバーのファイルを直接編集することなく管理画面から 410 レスポンスを管理します。
削除が意図しないものであれば、そのリソースまたはその後継を復元して 200 を返します。別の URL に代替ページが存在する場合は、410 よりも 301 リダイレクトのほうが適切です。
コードリファレンス
.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