304 Not Modifiedは未変更の本文を再送せずGooglebotへ応答する
公開日: 執筆:佐藤
304 Not Modifiedは、URLへ初めてアクセスした相手に返す通常の成功応答ではありません。相手がIf-Modified-SinceまたはIf-None-Matchを付けて再取得を求めたとき、対応する内容が変わっていなければ、本文を送らずに返す応答です。
内容を変更した場合は、200 OKと新しい本文を返します。304を返すこと自体をSEO施策にせず、同じ内容を再送しないためのHTTP処理として実装してください。
304は条件付きリクエストに対して返す
GooglebotのHTTP応答に関する説明では、Googlebotが以前に取得したURLへIf-Modified-Sinceを付けてアクセスした場合、内容が変わっていなければ304を返せるとしています。304にはページ本文を付けないため、サーバーから同じ内容をもう一度転送せずに済みます。
ここで分けるべきなのは、URLの存在と内容の更新です。
| 状態 | 返す応答 |
|---|---|
| 対象URLから正常な内容を返せて、条件付きリクエストではない | 200 OKと本文 |
| 対象URLから正常な内容を返せて、条件付きリクエストの基準より新しい | 200 OKと更新後の本文 |
| 対象URLから正常な内容を返せて、条件付きリクエストの基準から変わっていない | 304 Not Modified、本文なし |
| URLが存在しない | 304ではなく、削除や移転に合う応答 |
URLが存在するという理由だけで304を返すと、更新した本文を相手へ渡せません。反対に、内容が未変更でも毎回200と本文を返せば表示はできますが、同じデータを繰り返し転送します。
Last-ModifiedとIf-Modified-Sinceを対にする
サーバーがLast-Modifiedを返す場合、値は、そのURLで提供する内容を最後に変更した日時を表します。相手は次の取得で、その値をIf-Modified-Sinceへ入れて送れます。
HTTP/1.1 200 OK
Last-Modified: Thu, 29 Jan 2015 03:00:00 GMT
Content-Type: text/html
GET /guide/ HTTP/1.1
Host: www.example.com
If-Modified-Since: Thu, 29 Jan 2015 03:00:00 GMT
内容が変わっていなければ、サーバーは次のように応答します。
HTTP/1.1 304 Not Modified
RFC 7232は、If-Modified-Sinceを、指定日時より選択した内容が新しいかどうかでGETまたはHEADを条件付きにするheader fieldと定義しています。未変更なら内容の転送を避けられます。
記事の更新日時と無関係に、アクセスのたびに現在時刻をLast-Modifiedへ入れてはいけません。その値では、サーバーが内容の変更を判断できず、未変更の応答を再現できません。CMS、template、共通部品を含め、どの変更をページの更新として扱うかを決めます。
ETagを使う場合はIf-None-Matchで照合する
更新日時の代わりに、内容の版を識別するETagを応答へ付ける方法もあります。相手は、その値をIf-None-Matchへ入れて再取得します。一致する内容を提供しているなら304、不一致なら200と本文を返します。
RFC 7232では、If-None-MatchとIf-Modified-Sinceの両方を受け取った場合、If-None-Matchを先に評価します。二つのheader fieldを別々の規則で実装し、同じリクエストへ矛盾した応答を返さないようにしてください。
Last-ModifiedとETagのどちらを使う場合も、識別子を付ける作業と、内容が変わったときに識別子を更新する作業は一組です。古い識別子のまま304を返す実装は、転送量を減らしても、更新内容を届けられません。
未変更と更新後の二通りを試す
304の確認は、一回のアクセスだけでは終わりません。次の順で、未変更と変更後を分けて試します。
- 対象URLへアクセスし、200と本文、
Last-ModifiedまたはETagを記録する - 記録した値を条件付きheaderへ入れ、同じURLへ再びアクセスする
- 内容が未変更なら304となり、応答本文がないことを確認する
- ページ内容を変更し、古い条件付きheaderでもう一度アクセスする
- 200と更新後の本文、新しい識別子が返ることを確認する
対象はHTMLだけに限りません。画像、CSS、JavaScriptも、同じURLで内容を更新するなら、応答の識別子と実ファイルを対応させます。ただし、更新頻度と生成方法が違うresourceを、一つの固定日時でまとめて判断しないでください。
制作会社へ設定を頼む場合は、変更したサーバー設定だけでなく、対象URL、識別子の生成元、未変更時と変更後の応答記録を受け取ります。実装を委託しても、どの更新を公開内容の変更とするかは、サイト運営側で管理します。
304を検索順位のための応答として扱いません。完了条件は、Googlebot向けの特別な表示を作ることでもありません。通常の利用者と検索エンジンへ同じ内容を提供し、未変更なら本文を再送せず、変更後は新しい本文を返せることです。
関連記事

