SEO のキャッシュ

Cache-Control、ETag、CDN を使うブラウザーとサーバーのキャッシュがパフォーマンスと Core Web Vitals を改善する方法、そしてクロールに影響するキャッシュの落とし穴を説明します。

初回公開:2026年7月2日 · 最終更新:2026年8月22日 · Advanced
言語

キャッシュはページやリソースのコピーをブラウザー、CDN エッジ、クローラー自身のキャッシュに保存し、再生成や再ダウンロードを省きます。直接のランキング要因ではありませんが、TTFB と LCP を通じたページ速度/Core Web Vitals とクロール効率を支えます。Google のクローラーが尊重するのは ETag と Last-Modified(max-age は再クロールのヒント)だけで、「その他の HTTP キャッシュディレクティブはサポートされない」と文書化されています。最も危険なのは遅いキャッシュ期間ではなく、ボットをブロックまたは誤誘導する CDN 設定ミスと古いキャッシュです。

TL;DR — SEOに関係するキャッシュは、ブラウザー、CDNエッジ、クローラー自身の条件付きリクエストキャッシュという3層で機能します。ランキング要因ではありませんが、ページ速度(TTFB/LCP、bfcacheによる再ナビゲーションのCore Web Vitals)とクロール効率を動かします。GoogleのクローラーはLast-ModifiedよりETagを優先し、max-ageを再クロールのヒントとしてだけ読みます。公式文書によれば*“other HTTP caching directives aren’t supported.”* (翻訳) 「その他の HTTP キャッシュディレクティブはサポートされません」です。CDNはキャッシュが温まった後に高いクロール速度の許容量を得ます。本当のリスクは、冷えたキャッシュの公開やボットを完全にブロックするCDN/WAFの設定ミスです。

Evidence for this claim Google's crawler documentation supports ETag/If-None-Match and Last-Modified/If-Modified-Since, prefers ETag when both are present, and says other HTTP caching directives are unsupported; Google's separate max-age advice is a recrawl-timing hint, not proof it follows browser cache semantics. Scope: Google crawling Confidence: high · Verified: Crawling December: HTTP caching Evidence for this claim HTTP caching uses Cache-Control and validators to control reuse and revalidation. Scope: Current official or standards documentation. Confidence: high · Verified: MDN: HTTP caching Evidence for this claim Browser caches can reuse stored responses according to HTTP caching semantics. Scope: Current official or standards documentation. Confidence: high · Verified: MDN: HTTP caching

キャッシュの3層

SEOにおけるキャッシュは1つではなく、少しずつ制御方法が異なる3つです。

  1. ブラウザーキャッシュ — 訪問者の端末がファイルを保存し、再表示でネットワークを省きます。PageSpeed Insightsが「効率的なキャッシュポリシーで静的アセットを配信」と指摘するのはこれです。
  2. CDN/エッジキャッシュ — コンテンツ配信ネットワークが世界中のエッジノードにコピーを保存します。Google自身の説明では、CDNはオリジンとユーザーの間の仲介者で、歴史的に”biggest focus is caching” (翻訳) 「最大の焦点はキャッシュです」 でした。URLの内容を保存し、しばらくサーバーが再配信せずに済むようにします。
  3. クローラー側キャッシュ — GooglebotとBingbotが条件付きリクエストでコンテンツの変更を記録します。これはクロールバジェットのレバーで、仕組みは条件付きリクエストの記事に譲り、ここでは概要に留めます。

上で「ブラウザーキャッシュ」と呼んだものは、複数の仕組みをまとめた言い方です。MDNのHTTPキャッシュガイド で知っておくべきなのは、プライベートHTTPキャッシュ(ブラウザーごと、リクエスト単位でキー化され、現代のブラウザーではサイトをまたぐトラッキングを制限するためトップレベルサイトで分割)、現在のセッションに使うメモリ内キャッシュ、以下で扱うbfcache、そして別物としてサイト自身のJavaScriptが制御するサービスワーカーのCache Storageです。Cache-Controlヘッダーは直接管理しません。「ブラウザーキャッシュを確認する」は、どの仕組みが問題かで4通りのデバッグを意味します。

キャッシュがCore Web Vitalsに効く理由

ネットワーク経由のリソース取得は遅く、コストもかかります。キャッシュは変わっていないもののネットワーク遅延と転送コストをなくします。結果として、2つの指標に直接流れ込みます。TTFB(キャッシュ済みレスポンスならオリジンでの再生成を省く)とLCP(キャッシュ済みの画像/CSS/フォントが早く表示される)です。

重要なCache-Controlディレクティブ

Cache-Controlが主要なヘッダーです。知っておく価値があるものは次のとおりです。

  • max-age=<seconds> — 新鮮なコピーが有効な期間。変更しないバージョン付きアセットには、ChromeのLighthouse文書が1年以上のキャッシュ を推奨します。例:Cache-Control: max-age=31536000
  • no-cache — 「キャッシュしない」ではありません。「保存するが、再利用前にサーバーで再検証する」という意味です。軽量な304フローは有効です。
  • no-storeHTTPキャッシュにどのコピーも保存しない、という本当の意味です。一般的なプライバシースイッチではありません。RFC 9111によればブラウザー履歴を確実に消す方法ではなく、サービスワーカー自身のCache Storageについても何も述べません。
  • publicprivate — CDNのような共有キャッシュがレスポンスを保存できるか、エンドユーザーのブラウザーだけが保存できるか。
  • immutable — レスポンスが新鮮な間は再検証を完全に省きます。「決して古くならない」という意味ではなく、max-ageが切れれば通常の新鮮さのルールへ戻ります。
  • must-revalidate — 時間軸の反対側で、レスポンスが古くなったにだけ意味があります。古いコピーをそのまま配信せず、オリジンで再検証するようキャッシュに指示します。
  • s-maxagestale-while-revalidatestale-if-error — CDNなど共有キャッシュ向けの細かな制御です(共有キャッシュ専用の新鮮期間、バックグラウンド取得中の限定的な古い再利用、オリジンエラー時の限定的な古い再利用)。サポートはブラウザー/CDNで異なるため、依存する前に確認します。なお、以下で見るように、Googleのクローラーはこの追加ディレクティブ群をどれも尊重しません。

バージョン付きファイル名でキャッシュを無効化する

積極的にキャッシュしながらすぐ更新する方法は、ファイル名にコンテンツハッシュを入れることです。style.x234dff.cssのようにします。URLがキャッシュキーなので、ファイルを変えるとURLも変わり、キャッシュは新バージョンをすぐ取得し、旧版は好きなだけキャッシュできます。Googleのweb.dev HTTPキャッシュガイドBing自身のフロントエンドエンジニアリング記事 は同じパターンを説明しています。Bingはファイル内容をURLにハッシュし、“the URL acts as the cache key,” (翻訳) 「URL がキャッシュキーとして機能する」することでキャッシュを一貫させ、長い有効期間を可能にします。

bfcacheの落とし穴 — no-storeがひそかにCWVを損なう場所

見過ごされがちな問題です。back/forward cache(bfcache)は「戻る」でページを瞬時に復元します。bfcacheからの復元ではLCP/CLS/INPの測定を完全に省けるため、CrUXのフィールドデータには純粋なプラスです。しかしGoogleのbfcacheガイド によれば、ページ文書そのものCache-Control: no-storeを設定すると、歴史的にブラウザーがそのページをbfcacheへ保存しなくなりました。HTML文書を新鮮に保ちつつ戻る/進むキャッシュの適格性を失いたくないなら、no-storeではなくno-cacheまたはmax-age=0を使います。

キャッシュが「十分に新鮮」と判断する方法

バリデーターが関与する前に、キャッシュは新鮮さを確認します。保存したレスポンスの経過時間が、Cache-Controlで与えられた新鮮期間を過ぎたか(明示的な期間がなければ、キャッシュが推測できるヒューリスティック期間を過ぎたか)を調べます。Ageレスポンスヘッダーは共有キャッシュがレスポンスを保持している時間を示すため、DevToolsやCDNログから残りの新鮮期間を判断できます。新鮮ならキャッシュはリクエストなしですぐ再利用できます。古ければ再利用前に検証すべきで、そこでETagIf-None-MatchLast-ModifiedIf-Modified-Sinceが役立ちます。次に説明するGooglebot版の狭い仕組みの前提となる、一般HTTPの挙動です。

Googlebotがキャッシュを使う方法(クロール効率の観点)

Googleは2024年12月のCrawling December: HTTP caching 記事で、変更されていないページの再ダウンロードをクローラーが省けるよう、キャッシュを有効にしてほしいと異例なほど直接的に求めました。印象的なデータは、キャッシュ可能な取得が減少していることです。10年前は全取得の約0 026%がキャッシュ可能で、現在は0 017% でした。小さな数字ですが、Googleは明らかに反転を望んでいます。

ETagとLast-Modified — Googleが好むもの

Googleのクロール基盤は、2つの標準バリデーターをサポートします。ETagIf-None-Match)とLast-ModifiedIf-Modified-Since)です。Googleは、ETagの値が構造化されておらず日付文字列より解析ミスが起きにくいため、ETagを強く推奨 します。“We strongly recommend using ETag” (翻訳) 「ETag の使用を強く推奨します」。両方ある場合、HTTP標準どおりクローラーはETagの値を使います 。CMSなど他のアプリケーション が使うため、両方設定することもGoogleは勧めています。Last-Modifiedを使うなら、日付はHTTP形式(例:Fri, 4 Sep 1998 19:15:56 GMT)でなければ解析されません。

クローラーが保存したバリデーターと一致すると、サーバーは本文なしの304 Not Modifiedを返します。それが目的です。Google の説明どおり、“If the ETag value sent by the crawler matches” (翻訳) 「クローラーが送った ETag の値が一致すると」、本文がなければサーバーはコンテンツ生成 に計算資源を使わず、転送帯域も使いません。(304の仕組みは条件付きリクエストの記事で詳しく扱います。ここでは存在し、双方のコストを節約することを知れば十分です。)

ほとんどの人が見落とすニュアンス

Googleのクローラーは、ブラウザーやCDNと同じように完全なCache-Controlディレクティブ群に従うわけではありません。公式クローラー概要によれば、ETag/Last-Modified以外の”other HTTP caching directives aren’t supported.” (翻訳) 「その他の HTTP キャッシュディレクティブはサポートされません」 (その他のHTTPキャッシュディレクティブはサポートされない)ということです。部分的な例外は、URLをいつ再クロールするかの判断に役立つよう、任意でmax-age設定できる ことです。これは強制ロックではなく再クロールのヒントです。no-caches-maxagestale-while-revalidateなどはブラウザーとCDNの動作を形作りますが、Googlebotのキャッシュ方法は変えません。無効化についてのGoogleの助言は合理的です。大きな変更では キャッシュ更新を要求し、フッターの著作権年だけの更新は大きな変更ではありません。

CDNとクロール

CDNがもたらすのは速度だけではありません。Googleのクロール基盤は、“Our crawling infrastructure is designed to allow higher crawl rates” (翻訳) 「Google のクロール基盤はより高いクロール率を許可するよう設計されています」 を許容するよう設計されています。URLを配信するIPアドレスから推測し、CDN背後のオリジンはより多くの同時リクエストを処理できると仮定します。

ただし、計画すべき落とし穴は冷えたキャッシュです。URLへの最初のアクセスでは、“the CDN’s cache is “cold"" (翻訳) 「CDN のキャッシュは「冷えた」状態です」 です。まだ誰もリクエストしていないため、オリジンはキャッシュを温めるため少なくとも1回配信しなければなりません。Googleは、多数のURLを同時公開するとクロールバジェットに本当の負荷がかかり、数日間クロール速度が高くなると警告します。大規模な公開やサイト移行では、CDNが助け始める前にURLごとオリジンが全負荷を受けることを予算化します。

CDNの設定ミスはクロールのリスク

キャッシュに隣接する最も怖い問題は、キャッシュ期間が短いことではなく、ボットをブロックするCDNとWAFの設定です。GoogleのCDN記事は、一時的なブロックには”HTTP 503/429 status codes” (翻訳) 「HTTP 503/429 ステータスコード」 だと明記しています。一方、ネットワークタイムアウトは、URLをインデックスから削除させる可能性のある終端の「hard」エラーとして扱われます。微妙なのはソフトブロック、つまりボット確認のインタースティシャルです。クローラーにはサイトではなくチャレンジページしか見えないため、自動クライアントには代わりに”In case of these bot-verification interstitials” (翻訳) 「このようなボット検証インタースティシャルの場合」 します。CDNがGoogleをひそかにブロックしていないかの”the easiest way to check if things are working correctly” (翻訳) 「正しく動作しているかを確認する最も簡単な方法」 はSearch ConsoleのURL Inspectionです。レンダリング画像を確認し、ボットチャレンジや空ページならCDNに相談します。

リダイレクトをCDNへオフロードする技術は、私が気に入っている方法です。Marketing Speakポッドキャストでは、**“One of my personal favorites that I don’t think it’s used enough, it’s actually just off loading your redirects to the CDN level.”* (翻訳) 「個人的なお気に入りの一つで、十分に使われていないと思うのは、リダイレクトを CDN レベルへオフロードすることです。」*(個人的なお気に入りの1つで、十分に使われていないと思うのが、リダイレクトをCDNレベルへオフロードすること)と話しました。引用箇所へ

クロールとインデックス登録を損なうキャッシュの落とし穴

これは「SEOのキャッシュ」記事の多くが飛ばす角度です。キャッシュは速くするだけではありません。誤ったキャッシュはボットに誤ったバイト列を配信し、クロールやインデックス登録を壊します。

実例:共有キャッシュがブロックするrobots.txtを配信。 テスト環境と本番環境の間にある共有CDNキャッシュが原因で、Googlebotが断続的にブロックされたケースを調べました。Indexed, though blocked by robots.txt で書いたように、**“One possible cause would be a shared cache between a test environment and a live environment. When the cache from the test environment is active, the robots.txt file may include a blocking directive.”* (翻訳) 「テスト環境と本番環境の間の共有キャッシュが原因かもしれません。テスト環境のキャッシュが有効なとき、robots.txt にブロックディレクティブが含まれる可能性があります。」*(原因の1つはテスト環境と本番環境の共有キャッシュかもしれない。テスト環境のキャッシュが有効なとき、robots.txtにブロックディレクティブが含まれる可能性がある)。修正はキャッシュを分けるか、テスト環境では.txtファイルをキャッシュから除外することです。キャッシュ設定の誤りが直接クロール障害を引き起こしました。実際に痛手となるリスクはこの種類です。

同じ系統の落とし穴はほかにもあります。

  • 古いCDNキャッシュがボットに古いコンテンツを配信する。 エッジキャッシュが変更公開後も古い版を保持すると、ボットは古い版を見続けます。公開時にパージするか、ページが実際に変わる頻度にキャッシュ期間を合わせます。
  • Vary/User-Agentによるキャッシュ分断。 共有キャッシュのキーは通常URLだけですが、VaryUser-AgentAccept-Languageなどのリクエストヘッダーをキーに加え、異なる派生を別々に保存します。レスポンスを変えるヘッダーを漏らすと、あるリクエスターが別の派生を受け取ります。モバイル/デスクトップやボット/人の取り違えです。Varyにヘッダーを増やしすぎると、ほぼ重複するキーが増えてヒット率がほとんど改善しません。さらに現代のブラウザーはプライバシーのためトップレベルサイトで自身のキャッシュも分割します。あるサイトに埋め込まれたリソースは、別サイトの埋め込みでは通常再利用されません。これはVaryとは別の仕組みなので、「なぜキャッシュされないのか」を調べるときに混同しないでください。

期間についての私の一般的な目安はLCPの仕事から来ています。AhrefsのLargest Contentful Paintガイドで、“Your cache time should be as long as you are comfortable with”* (翻訳) 「キャッシュ期間は、自分が安心できるだけ長くすべきです。」*(キャッシュ期間は安心できる限り長くすべき)と書きました。また、“An ideal setup is to cache for a really long period of time but purge the cache when you make a change to a page.”* (翻訳) 「理想的な設定は長期間キャッシュし、ページを変更したときにキャッシュをパージすることです。」*(理想は非常に長くキャッシュし、ページを変更したときにキャッシュをパージすること)です。長いキャッシュと即時パージ。この組み合わせで速さと新鮮さを両立できます。引用箇所へ

キャッシュはランキング要因か

いいえ、直接ではありません。ETagを設定したことや良いCache-Controlポリシー自体にランキングシグナルはありません。キャッシュが行うのは、可視性に関係する2つ、ページ速度/Core Web Vitals(明示的なページエクスペリエンス入力)とクロール効率(新規・更新コンテンツが発見・更新される速度を左右し、鮮度が重要な結果に間接的に触れる)を支えることです。サイトを速くクロールしやすくするために設定し、直接ランキングが上がるとは期待しません。

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.