条件付きリクエスト:ETagとIf-Modified-Since、304 Not Modified

条件付きリクエスト(ETag、Last-Modified、If-Modified-Since/If-None-Match、304 Not Modified)で、Googlebotが変更のないページの再ダウンロードを省き、大規模サイトのクロールバジェットを守る方法を解説します。

初回公開:2026年6月28日 · 最終更新:2026年8月22日 · Advanced
言語
このページには証拠シグナルが1件あります

条件付きリクエストは、Googlebotが再ダウンロードの前に「前回クロールしてからページは変わったか」と確認する方法です。If-Modified-SinceをLast-Modifiedと照合するか、If-None-MatchをETagと照合します。変更がなければサーバーは本文なしの304 Not Modifiedを返し、クローラーは既存のコピーを再利用します。返答はページ全体より小さくなります。両方のバリデーターがある場合はGoogleがETagを優先しますが、両方を設定してください。Googleはすべてのクロールでヘッダーを送るわけではなく、304はインデックスシグナルを固定しません。効果は、変更頻度の低いURLが多い大規模サイトのクロール効率にあり、ランキング要因ではありません。常に本文付き200を返す、毎回変わるETagを生成する、実際の変更を反映しないLast-Modifiedを使う、という3つの設定ミスに注意します。

TL;DR — 条件付きリクエストにより、Googlebotはキャッシュ済みのコピーを再ダウンロードせずに検証できます。If-Modified-SinceLast-Modifiedヘッダーと照合)やIf-None-MatchETagと照合)を送り、変化がなければ本文のない304 Not Modifiedを返してクローラーがコピーを再利用します。完全なページが100 KB以上なのに対し、返答はおよそ1 KBです。両方のバリデーターがある場合はETagが優先され、Googleは日付形式の問題がないETagを推奨しつつ両方の設定を勧めています。Googleはすべてのクロールでヘッダーを送るわけではなく、条件によってはヘッダーなしで304を先回りして返すこともできます。304はインデックスシグナルを固定しません。常に本文付き200を返すこと、変動するETag、実際の変更を追わないLast-Modifiedという3つの設定ミスが仕組みを壊します。これは大規模サイト向けのクロール効率策であり、ランキング要因ではありません。 Evidence for this claim Google may send If-Modified-Since or If-None-Match, but a site must not assume every crawler request will contain either conditional header. Scope: official protocol/provider documentation and production verification Confidence: high · Verified: Troubleshoot Google Search crawling errors

Evidence for this claim Conditional requests use validators such as ETag and Last-Modified with If-None-Match or If-Modified-Since. Scope: Current official or standards documentation. Confidence: high · Verified: RFC 9110: Conditional requests Evidence for this claim A 304 response indicates a conditional request can reuse a stored representation and does not include a message body. Scope: Current official or standards documentation. Confidence: high · Verified: RFC 9110: 304 Not Modified

仕組みを正確に見る

クロール速度がGooglebotの取得の速さ、クロール頻度が戻ってくる頻度であるのに対し、条件付きリクエストは個々の再クロールにどれだけ少ないコストで答えられるかの仕組みです。クローラーとサーバーの間で行う検証ハンドシェイクで、HTTPヘッダーの2組を基盤にします。

送信するもの(レスポンスヘッダー)クローラーが返すもの(リクエストヘッダー)検証方法
Last-Modified: <date>If-Modified-Since: <date>日付を比較
ETag: "<fingerprint>"If-None-Match: "<fingerprint>"コンテンツIDを比較

流れを段階ごとに見てみましょう。

  1. 最初のクロールでは、サーバーが200 OKとともにページ、Last-Modifiedの日付、そして/またはETagのフィンガープリントを返します。
  2. 後のクロールでGooglebotはIf-Modified-Since(最後に見た日付を返す)やIf-None-MatchETagを返す)を送ることがあります。
  3. サーバーが検証します。意味のある変更がなければ、本文なしの304 Not Modified(ステータスとヘッダーだけ)を返します。
  4. Googlebotは前回クロールしたバージョンを再利用します。変更があれば、サーバーは完全な本文付き200 OKを返します。

Googleはこのハンドシェイクをほぼ逐語的に説明しています。“Google’s crawlers that support caching will send the ETag value returned for a previous crawl of that URL in the If-None-Match header. If the ETag value sent by the crawler matches the current value the server generated, your server should return an HTTP 304 (Not modified) status code with no HTTP body.” (翻訳)「キャッシュに対応するGoogleのクローラーは、対象URLを前回クロールしたときに返されたETag値をIf-None-Matchヘッダーで送ります。クローラーが送ったETag値がサーバーが生成した現在の値と一致する場合、サーバーは本文なしのHTTP 304(Not modified)ステータスコードを返すべきです。」 Evidence for this claim Google documents heuristic HTTP caching and support for ETag and Last-Modified validators for crawlers that support caching. Scope: official protocol/provider documentation and production verification Confidence: high · Verified: Things to Know about Google web crawling

The validator makes the recrawl conditional: unchanged content returns a lightweight 304, while a real change returns the full 200 response. 出典: Google Search Central

A crawler revalidates its saved copy by sending If-None-Match with an ETag or If-Modified-Since with a date. The server compares that validator. If the representation is unchanged, it returns 304 Not Modified without a response body and the crawler reuses its saved copy. If the representation changed, the server returns 200 OK with the full updated response body.

© Patrick Stox LLC · CC BY 4.0 ·

ETagとLast-Modified — GoogleがETagを好む理由

両方のバリデーターに対応します。Googleのクロール文書は次のように明記しています。“Google’s crawling infrastructure supports heuristic HTTP caching as defined by the HTTP caching standard, specifically through the ETag response- and If-None-Match request header, and the Last-Modified response- and If-Modified-Since request header.” (翻訳)「Googleのクロール基盤は、HTTPキャッシュ標準で定義されるヒューリスティックHTTPキャッシュに対応しています。具体的には、ETagレスポンスヘッダーとIf-None-Matchリクエストヘッダー、Last-ModifiedレスポンスヘッダーとIf-Modified-Sinceリクエストヘッダーを使います。」 Evidence for this claim Google documents heuristic HTTP caching and support for ETag and Last-Modified validators for crawlers that support caching. Scope: official protocol/provider documentation and production verification Confidence: high · Verified: Things to Know about Google web crawling

両方がある場合は**ETagが優先**されます。“If both ETag and Last-Modified response header fields are present in the HTTP response, Google’s crawlers use the ETag value as required by the HTTP standard.” (翻訳)「HTTPレスポンスにETagとLast-Modifiedの両方がある場合、GoogleのクローラーはHTTP標準に従いETag値を使います。」これはGoogle独自の癖ではなくHTTP仕様の優先順位で、Ahrefsの304 Not Modified用語集 で説明しているとおり、If-None-MatchIf-Modified-Sinceを両方使う場合はIf-None-Matchが優先されます。

ETagを優先する理由は、日付を解釈する必要がない不透明な文字列、つまりコンテンツのフィンガープリントだからです。Googleの推奨は次のとおりです。“For Google’s crawlers specifically, we recommend using ETag instead of the Last-Modified header to indicate caching preference as ETag doesn’t have date formatting issues.” (翻訳)「Googleのクローラーには、キャッシュの希望を示すためLast-ModifiedヘッダーではなくETagを使うことを推奨します。ETagには日付形式の問題がないためです。」Last-Modifiedを使うなら、HTTP標準の形式(Weekday, DD Mon YYYY HH:MM:SS Timezone)にします。Googleが解釈できない可能性があるためです。実務上は、可能なら両方を設定するのが安全です。

補助的なシグナルとしてCache-Control: max-ageもあります。Googleは必須ではないとしつつ、コンテンツが変更されないと予想する秒数を設定すれば、再クロール時期の判断材料になります。ただし非対称性に注意してください。Googleのクロール基盤はmax-ageをヒントとして尊重しますが、ブラウザーのように他のCache-Controlディレクティブを扱うわけではありません。

304がすること、しないこと

ネットワーク上の効果は大きくなります。304には本文がないため、Gary Illyesの概算では完全なページの100 KB以上に対して約1 KBです。完全なレンダリングやデータベースクエリが不要なので生成も安く、本文の再解析・再レンダリング・インデックス処理全体の再実行が不要なのでGoogle側の処理も軽くなります。

ただし、304がすることを正確に理解してください。ランキングシグナルを固定するものではありません。 Googleのステータスコード文書は、本文を再取得しなくてもインデックス処理パイプラインがURLのシグナルを「“may recalculate signals for the URL,” (翻訳)「再計算する可能性がある」」と説明しています。304が省略するのはコンテンツのダウンロードと再処理であり、後続の評価すべてではありません。「304を返してランキングを固定する」方法はありません。

Googleが常に要求するわけではない — 正常です

多くの解説が見落とす点です。Googlebotはすべてのリクエストで条件付きヘッダーを送るわけではありません。Googleのクロールエラー文書には次のようにあります。“Google generally supports the If-Modified-Since and If-None-Match HTTP request headers for crawling. Google’s crawlers don’t send the headers with all crawl attempts; it depends on the use case of the request (for example, AdsBot is more likely to set the If-Modified-Since and If-None-Match HTTP request headers).” (翻訳)「GoogleはクロールにIf-Modified-SinceとIf-None-MatchのHTTPリクエストヘッダーを一般にサポートします。ただし、すべてのクロール試行でクローラーがヘッダーを送るわけではなく、リクエストの用途によります。たとえばAdsBotは両方のヘッダーを設定する可能性が高くなります。」

ログを見てGooglebotがIf-None-Matchをほとんど送っていなくても、設定が壊れているとは限りません。そのクロールではGoogleが要求していないだけかもしれません。Googleは、個々のクローラーやフェッチャーが提供する製品に応じてキャッシュを使う場合と使わない場合があるとも説明しています。

反対に、あまり知られていない実装方法もあります。条件付きヘッダーをまったく受け取らなくても、コンテンツがGooglebotの前回訪問から変わっていなければ304を返せます。Googleの説明は次のとおりです。“Independently of the request headers, you can send a 304 (Not Modified) HTTP status code and no response body for any Googlebot request if the content hasn’t changed since Googlebot last visited the URL. This will save your server processing time and resources, which may indirectly improve crawl efficiency.” (翻訳)「リクエストヘッダーとは独立して、コンテンツがGooglebotの前回の訪問から変わっていなければ、任意のGooglebotリクエストに本文なしの304(Not Modified)HTTPステータスコードを返せます。サーバーの処理時間とリソースを節約し、間接的にクロール効率を改善する可能性があります。」これは高度なCDN/エッジ技法ですが、変更済みコンテンツに304を返すとバリデーターが嘘をつくため危険です。

クロールバジェットに重要な理由

Googleのクロールバジェット指針が対象にする、変更頻度の低いURLが多い大規模サイトで最も効果が積み重なります。ロングテールの商品SKU、ニュースや出版社のアーカイブ、大規模なドキュメントサイトでは、前回とバイト単位で同じページの再ダウンロードにクロールバジェットが使われます。そうしたページに304で答えれば、新規・変更ページのためにバジェットを空けられます。

正直に言えば、Googleは採用を増やしてほしいと求めているのであって、誰もがすでに実施していると報告しているわけではありません。Illyesによると、Googlebotの取得のうちキャッシュ可能な割合はウェブが成長した過去10年で約0,026%から約0,017%へ低下しました。つまり未利用のレバーです。「Crawling December」記事の見出しは、ほぼ文字どおりの願いです。“Allow us to cache, pretty please.” (翻訳)「どうかキャッシュさせてください。」多くのサイトはまだ設定できていません。

条件付きリクエストを壊すよくある設定ミス

バリデーターを設定することと、その恩恵を受けることは同じではありません。サイトがこれを静かに壊す方法は、3つ(正確には4つ)あります。

1. 常に本文付き200を返す

最も一般的な失敗は何もしないことです。サーバーがバリデーターを設定しない、または検証しないため、何も変わっていなくても毎回フル再ダウンロードになります。多くの場合、キャッシュ層を設定していないCMS/サーバースタックです。これはIllyesが解消を促している初期状態です。

2. リクエストごとに変わるETag

この問題は正しく見えるため厄介です。ETagを埋め込みタイムスタンプ、リクエスト/セッションごとのトークン、リクエストID、ビルド時刻を埋め込む成果物など、変動するものから計算すると、表示内容が同じでも毎回「新しい」ETagになります。If-None-Matchは一致せず、304を返す根拠がなくなります。対策は、リクエストごとに変わる値ではなく、実際のレスポンス本文のハッシュまたは安定したコンテンツバージョンIDからETagを作ることです。

3. CDN/クラスターのノードごとのばらつき

近い問題として、同じコンテンツなのに異なるオリジンノードが異なる(弱い)§ETag§を生成する場合があります。CDNやクローラーがノードを行き来すると、安定した値を見られず、304に到達しないまま検証を繰り返します。コンテンツから決定的にETagを作るか、フリート全体でETag生成を中央化してください。

4. 実際の変更を反映しないLast-Modified

Last-Modifiedを毎回のレンダリング時刻で更新したり、フッターの自動更新年のような些細な変更で進めたりすると、無意味なフル再クロールを誘発します。逆に古い値や作為的な値はGoogleのシグナルへの信頼を損ないます。これはサイトマップのlastmodにGoogleが求める正直さと同じ原則です。Last-Modifiedヘッダーも、検証可能な重要な変更がある場合だけ更新します。(lastmod

Illyesのエッジケース:304が壊れたページを固定するとき

これは独立して取り上げる価値があります。直感に反し、ほとんど解説されないからです。Illyesは、304が「“backfire spectacularly” (翻訳)「激しく裏目に出る」」ことがあると説明しています。サーバーのバグで壊れた空ページを200で返し、クローラーが一時的なエラーとして再クロールを予定した後、まだ壊れたページが304(変更なし)を正しく返すと、クローラーはエラー状態こそ永続的な「本当の」コンテンツだと判断し、再確認の頻度を下げる可能性があります。彼の説明は、クローラーが「“learn[ing] the error is persistable.” (翻訳)「エラーは永続するものだと学習する」」というものです。本人の注意書きは、“but it’s worth keeping this somewhere deep in your mind because debugging it is an absolute nightmare.” (翻訳)「ただ、デバッグがまったく悪夢になるので、心の奥に置いておく価値はあります。」です。基盤の生成が壊れているサイトに条件付きリクエストを追加してはいけません。

Bingはどう扱うか

これはGoogleだけの機能ではなく、Bingの対応はより古く、明示的とも言えます。Bing(Live Search時代)は2008年にRFC-2616準拠の条件付きGETを発表し、変更がなければページを再ダウンロードしないと説明しました。“generally will not download the page unless it has changed since the last time it crawled it” (翻訳)「前回のクロールから変更されていない限り、通常はページをダウンロードしません」。最後のダウンロード時刻をIf-Modified-Sinceで送り、利用可能ならIf-None-MatchETagも使います。現在のBingはこれをクロール効率という追跡可能な指標として扱い、Fabrice Canelはそれを「“how often we crawl and discover new and fresh content per page crawled.” (翻訳)「1ページをクロールするたびに、どのくらいの頻度で新しく新鮮なコンテンツを発見するか」」と定義します。不要な再クロールはスコアを直接下げます。 Evidence for this claim Conditional requests use validators such as ETag and Last-Modified with If-None-Match or If-Modified-Since. Scope: Current official or standards documentation. Confidence: high · Verified: RFC 9110: Conditional requests

ランキングに影響するか

いいえ。クロール速度とクロールバジェットの記事と同じ規律を守ってください。条件付きリクエストはクロール効率とリソースのレバーであり、ランキング要因ではありません。公式資料はETagIf-Modified-Since304をランキングと結び付けていません。間接的には、大規模または頻繁に更新されるサイトが新規・変更コンテンツを早くクロール・インデックスされやすくしますが、クロール効率自体はランキングシグナルではありません。

動作を検証する方法

真実はサーバーログにあります。GooglebotがIf-None-MatchIf-Modified-Sinceリクエストヘッダーを送り、サーバーが304を返しているかを確認します。実世界のデータは少ないため、Dave Smartによるサーバーログ調査 は有用です。検証済みGooglebotトラフィックを監視したところ、304になったリクエストは約1,3%で、大半は200でした。If-None-Matchのリクエストは、前回取得の直後にURLが再要求されたときに集中する傾向がありました。結論は、サイトが小さければ稀ですが、規模があれば「“significant savings” (翻訳)「大幅な削減」」になり得るという指針と一致します。小規模サイトで高い304率を期待せず、規模が大きくなれば意味が出ると考えてください。

条件付きリクエスト、速度、頻度、バジェットの違い

クロールバジェット周辺の用語を整理しましょう。

  • クロール速度 — Googlebotがどれだけ速く取得するか(供給側で、サーバーの健全性により抑制されます)。
  • クロール頻度 — 既知のURLをどれだけ頻繁に再取得するか(人気度と古さによります)。
  • クロールバジェット — 需要と容量の範囲、つまりGoogleがクロールでき、クロールしたいURLの集合です。
  • 条件付きリクエスト — 個々の再クロールにどれだけ安く答えられるかです。クロールの速さや頻度は変えませんが、変更のないページへの訪問をほぼ無料にし、同じコンテンツへのバジェット浪費を止めます。

Add an expert note

Pin an expert quote

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