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月時点)。

  1. 「ツール」→「Redirection」を開きます。
  2. 新しいリダイレクトを追加し、「ソース URL」に消したページのパス(例: /old-campaign/)を入れます。
  3. 詳細設定を開き、動作を「Error (404)」にして、HTTP コードに 410 を選びます。
  4. 保存して、上の 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 が出るときは、どこが返しているかを順に確かめます。マルチサイトの場合は、次の節のサイトの状態も確認します。

  1. 応答ヘッダーを見る。curl -I で server、via、cf-ray などのヘッダーを確認します。CDN や WAF の名前が出ていれば、そのサービスのルールを確認します。
  2. Redirection などのリダイレクト系プラグイン。ルール一覧に、対象の URL やそれを含むパターン(正規表現)で 410 を返すものが無いか確認します。プラグインを一時的に無効にすると切り分けられます。
  3. .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、リダイレクト系プラグイン、サーバー設定、マルチサイトのサイト状態の順に調べます。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲