Googleは、米国現地時間12月9日、Search Central Blogを更新し、Webサイトページのキャッシュ有効化について説明・推奨していましたのでご紹介します。先日のクロールの解説に続くTipsとして記載されている原文を和訳します。
キャッシュの有効化を推奨
Googleとしては、表示速度の速さからキャッシュを取るようなサイト設定を推奨しています。キャッシュできるように設定すると、ユーザー目線でページ更新した時にキャッシュが残ってしまい、更新後のコンテンツを(ちゃんと設定していないと)すぐに閲覧しづらくなってしまうので個人的には面倒くさくてあまり好きではないのですが…。まずはSearch Central Blogの内容を和訳します(一部、[Examples]以下のセクションは割愛しています)。
クロールの12月:HTTPキャッシュについて
キャッシュを有効化しましょう。
インターネットが長年に渡って成長するにつれ、Googleのクロール量も増加しました。Googleのクロールに関するインフラはヒューリスティックキャッシュ機能を採用しており、実際に常時サポートしてきましたが、ローカルキャッシュから返されるリクエストの数は減少しています。10年前は読込数全体の約0.026%がキャッシュ可能でしたが、現在はそこまでではありません。現在、その数は0.017%まで下がっています。
なぜキャッシュが重要か?
キャッシュは、インターネットという大きなパズルを形成する上で重要なピースとなっています。キャッシュにより、ページを再訪問した時、超高速で読み込むことができ、コンピューティングリソースと自然資源を節約し、クライアントとサーバーの両方で膨大な量の高価な帯域幅を節約できます。
特に、個々のURLで滅多に変更されないコンテンツを含む大規模なサイトの場合、ローカルでのキャッシュを許可すると、サイトのクロール効率が向上する可能性があります。Googleのクロールインフラストラクチャは、HTTPキャッシュ基準で定義されているヒューリスティックHTTPキャッシュをサポートしています(具体的には、ETagレスポンスとIf-None-Matchリクエストヘッダー、そしてLast-ModifiedレスポンスとIf-Modified-Sinceリクエストヘッダー経由)。
エラーや間違いが起きにくいため、ETagを使用することを強くお勧めします(Last-Modified値とは異なり構造化されていません)。応用した方法がある場合は、両方を設定してください。これはインターネットに優しい設定です。
クライアントのキャッシュの更新を必要とする変更と見なすかどうかは、自分次第です。コンテンツに重大な変更があった場合はキャッシュの更新を要求することをお勧めします。ページの下部にある著作権表示の日付のみを更新した場合程度では、重大な変更とは言いません。
ETagとIf-None-Match
Googleのクローラーは、HTTPキャッシュ基準で定義されている通りに条件付きリクエストに基づいたETagをサポートしています。つまり、Googleのクローラーにキャッシュ設定を通知するには、アクセスしたURLでホストされているコンテンツの表現に固有の任意のASCII文字列(通常はコンテンツのハッシュまたはバージョン番号ですが、πの一部でも結構です)にETag値を設定します。例えば、同じURLで同じコンテンツの異なるバージョン(モバイル版とデスクトップ版等)をホストする場合、各バージョンに独自の個別ETag値を設定できます。
キャッシュをサポートするGoogleのクローラーは、そのURLの以前のクロールに対して返されたETag値をIf-None-Matchヘッダーで送信します。クローラーによって送信されたETag値がサーバーが生成した現在の値と一致するIf-None-Matchヘッダーの場合、サーバーはHTTP本文のないHTTP 304(未変更)ステータスコードを返すはずです。この最後の部分(HTTP本文のない話)は、下記の理由等から重要な部分と言えます:
- サーバーは実際にコンテンツを生成するためにコンピューティングリソースを費やす必要がないため、コスト節約に繋がります。
- サーバーはHTTP本体を転送する必要がないので、コスト節約に繋がります。
ユーザーのブラウザやGooglebotなどのクライアント側では、そのURLのコンテンツがクライアントの内部キャッシュから取得されます。データ転送が伴わないため、この処理は超高速で行われ、ユーザー満足だけでなくリソースの節約にもつながるわけです。
Last-ModifiedとIf-Modified-Since
ETagと同様に、GoogleのクローラーはLast-Modified basedも、HTTPキャッシュ基準で定義されている通りに条件付きリクエストをサポートしています。これは、セマンティックな観点からはETagと同じように機能し(識別子を使用してリソースがキャッシュ可能かどうかを判断します)、ETagクライアント側と同じ利点があります。
但し、Last-Modifiedキャッシュディレクティブとして使用する場合、いくつかの推奨事項があります。
- Last-Modifiedヘッダー内の日付は、HTTP基準に従ってフォーマット化する必要があります。解析の問題を回避するために、次の日付形式を使用することをお勧めします:“Weekday, DD Mon YYYY HH:MM:SS Timezone”。例:“Fri, 4 Sep 1998 19:15:56 GMT”。
- 必須ではありませんが、クローラーが特定のURLをいつ再クロールすべきか判断できるよう、Cache-Controlヘッダーにmax-agefieldを設定することもご検討ください。max-agefieldの値をコンテンツが変更されないと予想される秒数に設定します。例:“Cache-Control: max-age=94043”。
引用)Search Central Blogより一部和訳
今回のブログの主な内容としては、“Webサイトのキャッシュを有効化してください”というような趣旨です。Googleのクローラーはブラウザと同じようにキャッシュの取り扱いができるため、キャッシュが有効化されているサイトは再訪問したときにスピーディーにクロールでき、特に、大規模サイトで、殆ど変更されないコンテンツを含む場合、キャッシュを有効化することでサイト全体のクロール効率も向上することがあるとのことです。
また、キャッシュを有効化するための仕組みとして2種類の方法があり、“ETagとIf-None-Matchを利用する方法”、そして“Last-ModifiedとIf-Modified-Sinceを利用する方法”です。
ETagを利用する方法については、Webサイトの更新に合わせて、キャッシュ情報と合わせてETag情報も更新します。初回アクセス時に、キャッシュとETagの情報をブラウザは保存しますので、2回目以降アクセスする際に、If-None-Matchリクエストをすると、ETagが更新されていない場合はキャッシュを読み込み、ETagが更新されている場合はページも更新しているので最新のコンテンツの読み込むようになる、というキャッシュ有効化の仕組みになっています(基本的にブラウザはIf-None-Matchをリクエストするようになっています)。ETagの情報自体はバージョン管理識別子のようなもので、任意の文字列の組み合わせで出来ているため、情報のやり取りもスムーズかつ高速に出来るとのことです。
Last-Modifiedについても、ETagとほぼ同じような仕組みで、ETagの値がLast-Modifiedという日付情報の値になっているイメージですね。但し、Last-Modifiedを設定する際の推奨設定項目として、日付のフォーマットと再クロールのタイミング目安の設定をするように説明してくれております。
ETagとLast-Modifiedでは、基本的にETagの情報が優先されるようですが、Googleはどちらも設定することを推奨しています。
また、今回のブログ公表のタイミングで、Googleの公式ドキュメント「Overview of Google crawlers and fetchers(user agents)」も更新されており、ここでの追加項目に関しては、ブログの内容を要約して掲載しているので、記載内容は同じです。
Documentation for cache control support of Google’s crawlers
What: Added a section about how Google’s crawlers handle cache control headers in the overview of Google’s crawlers.
Why: While the information was already public in form of a blog post, it was never officially made into documentation.
Googleクローラーのキャッシュ制御サポートに関するドキュメント
内容: overview of Google’s crawlersにGoogleクローラーがキャッシュ制御ヘッダーを処理する方法に関するセクションを追加しました。
理由: 情報は既にブログ投稿で公開していたものの、公式ドキュメント化はしていなかったため。
コーダーは必見
キャッシュの有効化問題については色々な意見がありますが、Googleは推奨していますし、次回の更新のタイミングも把握していれば問題ないという解釈ですね。基本的にはキャッシュを有効化しておいて、更新のタイミングでキャッシュを外して…みたいな感じでも良いかと思いますが、クローラーと呼吸を合わせたいのであれば今回のGoogleの推奨事項を遵守したほうが良さそうです。
いずれにしましてもキャッシュのテクニックとしてコーダーは理解しておいた方が良いですね。こういった設定は地味ですし、誰も気づいてくれないような設定ですが、プロであれば(承認欲求無しの)プライド一本で実装しましょう(笑)。