2026年5月22日
2026年5月22日
410 Gone とは|WordPress で削除したページに 410 を返す方法と、意図せず 410 が出るときの原因
「410 Gone」は、そのURLにあったページは削除され、今後も戻らないことを示す HTTP の状態コードです(RFC 9110 15.5.11)。「見つからない」だけを示す 404 と違い、サイトの運営者が意図して「もう無い」と伝えるときに使います。
WordPress の記事を削除しても、WordPress は 410 を返しません。削除した記事・固定ページの URL には 404 を返します。この記事では、次の 2 つの場面を扱います。
- 終了したキャンペーンページなどに、意図して 410 を返したい
- 開くと 410 が表示されるが、設定した覚えがない
404 と 410 の違い
| 項目 | 404 Not Found | 410 Gone |
|---|---|---|
| 意味 | 今はそのURLに何も無い。一時的か恒久的かは示さない | 運営者が意図して削除し、今後も戻らない |
| WordPress の既定 | 存在しない URL・削除した記事はこれになる | 既定では返さない(マルチサイトの無効化・アーカイブされたサイトを除く) |
| 主な使いどころ | 打ち間違い、まだ作っていないページ | 終了したキャンペーン、意図して消した記事、スパムで作られた URL |
Google は、429 を除く 4xx の状態コードをすべて同じに扱い、以前インデックスされていた URL は 404 でも 410 でもインデックスから外すと説明しています(Google 検索セントラル: HTTP ステータス コード、ネットワーク エラー、DNS エラー、2026年11月時点)。そのため、検索結果から消す目的だけなら 404 のままで足ります。410 は「意図して消した」ことを明示したいとき、ログや監視で 404(リンク切れ)と区別したいときに使います。
代わりのページがある場合は、410 ではなく 301 リダイレクトで新しい URL に案内してください。考え方は 301リダイレクトとSEO で説明しています。
WordPress で 410 を返す方法
どの方法でも、設定後に次のコマンドで状態コードを確かめます。
curl -I https://example.com/old-campaign/
# 1 行目が HTTP/1.1 410 Gone(HTTP/2 なら HTTP/2 410)になれば成功
キャッシュ系プラグインや CDN を使っている場合は、設定後にキャッシュを消してから確かめます。
方法1: Redirection プラグインを使う
管理画面だけで設定したいなら、Redirection プラグインが使えます。公式の説明では、ルールの動作(When matched)に「Error (404)」を選ぶと、返す HTTP コードを 400・401・403・404・410・418・451・500・501・502 から選べます(Redirection: Redirect Actions、2026年11月時点)。
- 「ツール」→「Redirection」を開きます。
- 新しいリダイレクトを追加し、「ソース URL」に消したページのパス(例:
/old-campaign/)を入れます。 - 詳細設定を開き、動作を「Error (404)」にして、HTTP コードに
410を選びます。 - 保存して、上の
curl -Iで確かめます。
日本語の画面では項目名が訳されていることがあります。プラグインの基本的な使い方は Redirection プラグインの使い方 を参照してください。
方法2: Apache の .htaccess に書く
Apache なら、mod_alias の Redirect gone で 410 を返せます(Apache mod_alias: Redirect)。WordPress の書き換えより前に処理させるため、.htaccess の # BEGIN WordPress より上に書きます。
# 終了したページに 410 を返す(# BEGIN WordPress より上に書く)
Redirect gone /old-campaign/
Redirect gone /2019-sale/
複数の URL をパターンでまとめるなら、mod_rewrite の G フラグを使います(Apache mod_rewrite: G フラグ)。
<IfModule mod_rewrite.c>
RewriteEngine On
# /campaign-2019/ 以下をすべて 410 にする
RewriteRule ^campaign-2019/ - [G]
</IfModule>
WordPress を /blog/ のようなサブディレクトリに置いている場合、Redirect gone のパスにはサブディレクトリも含めます。.htaccess の書き方は Apache の .htaccess の書き方 にまとめています。
方法3: Nginx の設定に書く
Nginx は .htaccess を読まないので、server ブロックに書きます(ngx_http_rewrite_module: return)。
location = /old-campaign/ {
return 410;
}
location ^~ /campaign-2019/ {
return 410;
}
sudo nginx -t && sudo systemctl reload nginx
方法4: テーマの functions.php か独自プラグインで返す
サーバーの設定を触れない場合は、PHP で状態コードを差し替えます。WordPress は存在しない URL に 404 を設定してから template_redirect を実行するので、そこで対象の URL だけ status_header( 410 ) に変えると、テーマの 404 テンプレートがそのまま 410 で表示されます。
<?php
// 削除したページの URL に 410 を返す(テーマの 404 テンプレートで表示される)
add_action( 'template_redirect', function () {
if ( ! is_404() ) {
return;
}
$path = wp_parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );
$path = untrailingslashit( (string) $path );
// サブディレクトリに WordPress を置いているときは、そのパスも含めて書く
$gone = array(
'/old-campaign',
'/2019-sale',
);
if ( in_array( $path, $gone, true ) ) {
status_header( 410 );
}
} );
is_404() で絞っているので、同じ URL に新しいページを作ると、そのページは通常どおり表示されます。テーマを切り替えると消える点に注意し、長く使うなら独自の小さなプラグインにまとめます。
意図せず 410 が表示されるとき
設定した覚えがないのに 410 が出るときは、どこが返しているかを順に確かめます。マルチサイトの場合は、次の節のサイトの状態も確認します。
- 応答ヘッダーを見る。
curl -Iでserver、via、cf-rayなどのヘッダーを確認します。CDN や WAF の名前が出ていれば、そのサービスのルールを確認します。 - Redirection などのリダイレクト系プラグイン。ルール一覧に、対象の URL やそれを含むパターン(正規表現)で 410 を返すものが無いか確認します。プラグインを一時的に無効にすると切り分けられます。
.htaccessやサーバーの設定。Redirect gone、RedirectMatch gone、[G]を含む行、Nginx のreturn 410を探します。
# Redirect gone / RedirectMatch gone と、G フラグ付きの RewriteRule を探す
grep -n -i -E 'gone|\[([^]]*,)?G(,[^]]*)?\]' /var/www/html/.htaccess
sudo grep -rn "return 410" /etc/nginx/
マルチサイトで、サイトの状態が原因のとき
マルチサイトでは、ネットワーク管理で「無効化」または「アーカイブ」「スパム」にしたサイトを開くと、WordPress 本体が 410 を返します。英語の画面では This site is no longer available.(無効化)または This site has been archived or suspended.(アーカイブ・スパム)と表示されます(ms-load.php の ms_site_check())。特権管理者でログインしているとこの確認が飛ばされ、普通に表示されるため、ログアウトした状態で確かめます。
WP-CLI では、状態ごとにサイトを一覧にして元に戻せます(wp site)。
# 無効化・アーカイブ・スパムのサイトを探す
wp site list --deleted=1 --fields=blog_id,url
wp site list --archived=1 --fields=blog_id,url
wp site list --spam=1 --fields=blog_id,url
# サイト ID 3 を元に戻す(該当するものだけ実行する)
wp site activate 3
wp site unarchive 3
wp site unspam 3
wp-content/blog-deleted.php や wp-content/blog-suspended.php を置くと、これらの場面で表示する画面を差し替えられます。
注意点
- 410 にした URL は、検索結果から外れ、外部からのリンクの評価も引き継がれません。代わりのページがあるなら 301 リダイレクトを選びます。
- 一時的に止めているだけのページに 410 を使わないでください。一時的な停止なら 503(メンテナンス)を使います。
.htaccessやサーバー設定を変える前に、元のファイルを複製しておきます。
よくある質問
削除した記事は 404 と 410 のどちらにすべきですか
検索結果から消す目的だけなら、WordPress の既定の 404 のままで足ります。Google は 404 と 410 を同じに扱います。意図して消したことをログや監視で区別したいときに 410 にします。
410 にした URL に、あとで同じ URL のページを作れますか
作れます。方法4 のコードは 404 のときだけ 410 に変えるので、ページを作れば通常どおり表示されます。Redirection や .htaccess、Nginx で設定した場合は、そのルールを先に消します。
404 ページのデザインは 410 にも使われますか
方法4 では、テーマの 404 テンプレートがそのまま使われます。Apache や Nginx で返す場合はサーバーの既定のエラー画面になります。404 ページの作り方は WordPress の 404 ページをカスタマイズする方法 を参照してください。
まとめ
- 410 Gone は「意図して削除し、戻らない」ことを示す状態コードで、WordPress は削除した記事に既定で 404 を返します。
- 410 を返すには、Redirection、
.htaccessのRedirect gone、Nginx のreturn 410、PHP のstatus_header( 410 )のどれかを使い、curl -Iで確かめます。 - 意図しない 410 は、CDN・WAF、リダイレクト系プラグイン、サーバー設定、マルチサイトのサイト状態の順に調べます。