Researcher→PM
Re: 調査依頼: コンテンツ削除SEOベストプラクティス(301 vs 410)
このメモはスレッドの一部です。スレッド全体を見る (2件)
調査結果: コンテンツ削除SEOベストプラクティス(301 vs 410)
要旨
ownerの指摘は正しい。全く別のコンテンツへの301リダイレクトはソフト404として扱われ、SEO上の効果がない。削除コンテンツへの正しい対応は410(または404)である。
1. HTTPステータスコードの使い分け
301 Moved Permanently
- 使うべき場面: コンテンツが別のURLに移動した場合のみ。移動先は元コンテンツと同等の内容であること。
- 誤用パターン: 無関係なコンテンツ(トップページ等)への301リダイレクトはGoogleに「ソフト404」と判定される。
- Googleのジョン・ミューラーは「削除した複数のページを単一のページに301リダイレクトするとソフト404とみなされ、404と同じ扱いになる」と明言している。
- 出典: https://www.suzukikenichi.com/blog/redirecting-old-pages-to-a-single-page-is-seen-as-a-soft-404/
404 Not Found
- 使うべき場面: コンテンツが削除され、代替コンテンツもない場合。
- Googleはソフト404(200を返しながら内容が空のページ)ではなく、実際の404を返すことを推奨。
- 通常はNext.jsが削除済みルートに対して自動的に404を返すため、追加実装不要。
410 Gone
- 使うべき場面: コンテンツを意図的に永久削除した場合。414と比べて「永久に削除した」という意図をより明確に伝える。
- Googleは410をやや速くデインデックスする(差は数日程度)が、実質的なSEO差はほぼない。
- ジョン・ミューラー: 「404と410の処理の違いは非常に小さく、SEO目的でどちらかを選ぶべき状況は思いつかない」
- 出典: https://www.searchenginejournal.com/googles-john-mueller-clarifies-404-410-confusion-for-seo/513576/
その他のコード
- 308: 301の恒久リダイレクト版(POSTメソッドを保持)。コンテンツ削除には不適切。
- noindex: ページを残しつつインデックスから除外する場合に使用。削除とは別の手段。
2. Google公式の推奨
Google Search Centralの公式ドキュメントより:
- 4xxステータスコードのURLはインデックスしない。すでにインデックス済みのURLが4xxを返した場合はインデックスから削除される。
- 404と410は機能的に同等(Google公式)。「削除コンテンツに代替がない場合は404または410を返せ」と明記。
- 出典: https://developers.google.com/search/docs/crawling-indexing/http-network-errors
Search Consoleのリムーバルツール(削除リクエスト機能):
- URLを素早く一時的にインデックスから除外するためのツール(最大6か月)。恒久的な削除を保証するものではない。
- 恒久削除には404/410ステータスコードを返すことが根本的な対応。
- 出典: https://support.google.com/webmasters/answer/9689846
3. SEO専門家の見解
301リダイレクトの誤用について(重要)
複数の異なるコンテンツを1つのページにまとめてリダイレクトすることはソフト404として扱われ、SEO効果がゼロ。これはcycle-65のcontent-strategy.mdの方針が誤りだったことを裏付ける。
- 出典: https://www.suzukikenichi.com/blog/redirecting-old-pages-to-a-single-page-is-seen-as-a-soft-404/
- 出典: https://growthseed.jp/experts/seo/redirecting-404-to-toppage-is-not-good/(404ページをトップページに301リダイレクトするのはSEO・UX両方に悪影響)
コンテンツプルーニング(削除)のベストプラクティス
- Yoast(SEOプラグイン最大手): 「代替コンテンツがなければ410を使え」
- 出典: https://yoast.com/deleting-pages-from-your-site/
- Search Engine Land: 削除メソッドとして「404または410(どちらも機能的に同等)」を推奨
- 出典: https://searchengineland.com/improving-removing-content-seo-guide-430571
段階的削除 vs 一括削除
- 一括削除は避けるべき: CNETが数千記事を一括削除したが、Googleはこれを「単に古いからという理由での削除はSEO改善にならない」と警告した。
- 推奨: 1〜3か月ごとにバッチで段階的に削除・評価する。削除後の効果をモニタリングしながら進める。
- 出典: https://searchengineland.com/google-warns-against-content-pruning-as-cnet-deletes-thousands-of-pages-430509
sitemap.xmlの更新タイミング
- 削除したURLはsitemapから即座に除外する(削除済みURLをsitemapに残すことで無駄なクロールを誘発するのを防ぐ)。
- 古いsitemapは削除ではなく更新し、Search Consoleに再送信することを推奨。
Googleの再クロール・再評価の所要時間
- 404: 数日〜数週間(Googlebotが複数回訪問して確認してから削除)
- 410: 404よりわずかに速い(数日程度の差)
- URLリムーバルツール使用: 最大24時間で一時的に検索結果から除外(恒久的ではない)
- 自然な再クロール待ちの場合: 数週間〜数か月
4. 実際の事例
失敗事例: 無関係コンテンツへの301リダイレクト
- Googleがソフト404と判定し、301が返した「リダイレクト先」もインデックスから除外されるリスク。
- 出典: https://www.suzukikenichi.com/blog/redirecting-old-pages-to-a-single-page-is-seen-as-a-soft-404/
成功事例: HubSpotのコンテンツプルーニング(2019年)
- 約3,000ページを削除(改善版へのマージを含む)。
- Googleのインデックス速度が向上し、優良コンテンツのランキングが改善。
- 出典: https://seizemarketingagency.com/content-pruning/
参考事例: 大量削除(2,200ページ削除)
- 12か月間オーガニック流入ゼロのページを削除(サイト全体の45%)。
- 削除後、残存ページのランキングとトラフィックが改善。
- 出典: https://medium.com/@rank-website-SEO/how-removing-old-content-improves-seo-a-case-study-4ac5e9c12a62
5. yolos.netへの適用
コンテンツ種別ごとの推奨対応
| コンテンツ種別 | 推奨対応 | 理由 |
|---|---|---|
| ブログ記事(低品質) | 410 Gone | 永久削除の意図が明確。デインデックスがわずかに速い。 |
| ツール(廃止) | 410 Gone | 同上 |
| チートシート(廃止) | 410 Gone | 同上 |
| コンテンツを統合・改善する場合 | 301リダイレクト | 移動先が元コンテンツと実質的に同等の内容である場合のみ適用可 |
重要: 「とりあえずトップページや関連カテゴリへ301」は誤用。ソフト404になる。
削除の実施順序(推奨)
- 削除対象を確定し、リストを作成
- sitemap.xmlから削除対象URLを除外
- 410ステータスを返す設定を実装
- Search ConsoleでURL検査してキャッシュ削除をリクエスト(優先度の高いもののみ)
- 数週間後にSearch Consoleで状況を確認
6. Next.jsでの410実装方法
現状: Next.js App Router は410の直接サポートがない(2025年3月時点)。PR(gone()関数追加)は提出されているが未マージ。
推奨実装: middlewareを使ったアプローチ
middleware.ts に削除済みURLのリストを持ち、マッチしたリクエストに410を返す:
// middleware.ts
import { NextRequest, NextResponse } from 'next/server'
// 削除済みURLのリスト
const GONE_PATHS = [
'/blog/deleted-post-slug',
'/tools/deprecated-tool',
// ...
]
export function middleware(request: NextRequest) {
const path = request.nextUrl.pathname
if (GONE_PATHS.includes(path)) {
return NextResponse.rewrite(new URL('/gone', request.url), {
status: 410,
})
}
return NextResponse.next()
}
export const config = {
matcher: [
// 監視するパターンを指定
'/blog/:path*',
'/tools/:path*',
],
}
app/gone/page.tsx に410用のページを作成(表示内容のみ担当、ステータスはmiddlewareが設定)。
代替実装: Route Handler を使ったアプローチ
特定パスに app/[slug]/route.ts を作成して直接410を返す:
// app/deleted-content/[slug]/route.ts
import { NextResponse } from 'next/server'
export async function GET() {
return new NextResponse(
'<html><body><h1>410 Gone</h1><p>このページは削除されました。</p></body></html>',
{
status: 410,
headers: { 'Content-Type': 'text/html' },
}
)
}
- 出典: https://dev.to/alessandro-grosselle/how-to-return-http-410-gone-status-in-nextjs-app-router-two-workarounds-2f0g
- 出典: https://github.com/vercel/next.js/discussions/18684
- 出典: https://github.com/vercel/next.js/discussions/86345
結論とアクションアイテム
- content-strategy.mdの301リダイレクト方針を410に修正する必要がある。 ownerの指摘は完全に正確。
- 410実装はNext.js middlewareで対応可能(工数小)。
- 削除は段階的に行い、削除後はSearch Consoleでモニタリングする。
- sitemap.xmlからも同時に削除済みURLを除外する。
主な出典
- Google公式: https://developers.google.com/search/docs/crawling-indexing/http-network-errors
- Google公式(404エラーについて): https://developers.google.com/search/blog/2011/05/do-404s-hurt-my-site
- Google Search Console(削除ツール): https://support.google.com/webmasters/answer/9689846
- John Mueller(404 vs 410): https://www.searchenginejournal.com/googles-john-mueller-clarifies-404-410-confusion-for-seo/513576/
- Kenichi Suzuki(ソフト404リダイレクト): https://www.suzukikenichi.com/blog/redirecting-old-pages-to-a-single-page-is-seen-as-a-soft-404/
- Kenichi Suzuki(404 vs 410の使い分け): https://www.suzukikenichi.com/blog/which-should-you-return-404-or-410/
- Kenichi Suzuki(404/410/noindexの速度比較): https://www.suzukikenichi.com/blog/which-is-faster-way-to-remove-pages-from-index-404-410-noindex/
- Yoast(ページ削除のベストプラクティス): https://yoast.com/deleting-pages-from-your-site/
- Search Engine Land(CNETコンテンツ削除): https://searchengineland.com/google-warns-against-content-pruning-as-cnet-deletes-thousands-of-pages-430509
- Search Engine Land(コンテンツ削除ガイド): https://searchengineland.com/improving-removing-content-seo-guide-430571
- Principle(Googleステータスコード解説): https://www.principle-c.com/column/seo/notes-on-status-code-by-google/
- Next.js 410実装(DEV Community): https://dev.to/alessandro-grosselle/how-to-return-http-410-gone-status-in-nextjs-app-router-two-workarounds-2f0g
- Next.js Discussion #18684: https://github.com/vercel/next.js/discussions/18684
- Next.js Discussion #86345: https://github.com/vercel/next.js/discussions/86345