2024 年 12 月 9 日(星期一)
请允许我们缓存,拜托啦。
多年来,随着网络蓬勃发展,Google 抓取量也日益攀升。虽然 Google 的抓取基础架构支持启发式缓存机制,但实际上一直以来,可从本地缓存返回的请求数量在逐渐减少:10 年前,总抓取量中约有 0.026% 的内容可缓存,尽管这个数字已然不高,但如今已降至 0.017%。
为什么缓存很重要?
网络就像一块大拼图,缓存是其中不可或缺的那一块。缓存可让网页在用户再次访问时快速加载,节省计算资源,进而节省自然资源,并为客户端和服务器节省大量昂贵的带宽。
特别是如果您的网站非常庞大,且各个网址下的内容很少更改,那么允许在本地进行缓存,有助于我们更高效地抓取您的网站。Google 的抓取基础架构支持 HTTP 缓存标准所定义的启发式 HTTP 缓存,具体而言,就是通过 ETag
响应和 If-None-Match
请求标头以及 Last-Modified
响应和 If-Modified-Since
请求标头提供支持。
我们强烈建议您使用 ETag
,因为它不易出错(不同于 Last-Modified
值,它不是结构化值)。如果可以的话,请同时设置这两个值:网络会感谢您的。或许吧。
您可以自行决定内容更改是否需要客户端刷新缓存。我们建议您在内容有重大更改时要求刷新缓存;如果您仅更新了网页底部的版权日期,则可能不属于重大更改。
ETag
和 If-None-Match
Google 的抓取工具支持基于 ETag
的条件请求,正如 HTTP 缓存标准中所定义的那样。也就是说,若要向 Google 抓取工具发出缓存偏好设置信号,请将 Etag
值设为任意 ASCII 字符串(通常是内容或版本号的哈希值,但也可以是 π 的一部分,具体由您决定),该字符串因访问网址所托管内容的表示法而异。例如,如果您在同一网址下托管同一内容的不同版本(例如,移动版和桌面版),则每个版本都可以有专属的 ETag
值。
支持缓存的 Google 抓取工具会发送 ETag
值,该值是之前在 If-None-Match header
中抓取该网址时返回的值。如果抓取工具发送的 ETag
值与服务器生成的当前值相匹配,您的服务器应返回 HTTP 304
(未修改)状态代码,且没有 HTTP 正文。没有 HTTP 正文,这一点至关重要,原因如下:
- 您的服务器无需耗费计算资源来实际生成内容;也就是说,您可以节省资金
- 您的服务器不必传输 HTTP 正文;也就是说,您可以节省资金
在客户端(例如用户的浏览器或 Googlebot)上,系统会从客户端的内部缓存中检索该网址下的内容。由于不涉及数据传输,因此速度快如闪电,不仅能让用户满意,还能节省资源。
Last-Modified
和 If-Modified-Since
与 ETag
类似,Google 抓取工具也支持 Last-Modified based
条件请求,完全符合 HTTP 缓存标准中的定义。从语义的角度来看,这与 ETag
的运作方式相同,二者都是使用标识符来决定资源是否可缓存。从客户端的角度来看,这可提供与 ETag
相同的优势。
如果您将 Last-Modified
用作缓存指令,我们有几点建议:
-
Last-Modified
标头中的日期格式必须符合 HTTP 标准。为了避免出现解析问题,我们建议您使用以下日期格式:“星期几,DD Mon YYYY HH:MM:SS 时区”。例如,“Fri, 4 Sep 1998 19:15:56 GMT”。 -
虽然
Cache-Control
标头的max-age
不是必需字段,但建议您一并设置,从而帮助抓取工具确定何时重新抓取特定网址。将max-age
字段的值设置为预计内容保持不变的秒数。例如Cache-Control: max-age=94043
。
示例
如果您和我一样,不太清楚启发式缓存的工作原理,建议您参考请求和响应链的示例,或许会有所帮助。以下两个链(一个用于 ETag
/If-None-Match
,另一个用于 Last-Modified
/If-Modified-Since
)可直观呈现其工作原理:
ETag /If-None-Match |
Last-Modified /If-Modified-Since |
|
---|---|---|
服务器对抓取的响应:这是抓取工具用于保存前提条件标头字段 ETag 和 Last-Modified 的响应。
|
HTTP/1.1 200 OK Content-Type: text/plain Date: Fri, 4 Sep 1998 19:15:50 GMT ETag: "34aa387-d-1568eb00" ... |
HTTP/1.1 200 OK Content-Type: text/plain Date: Fri, 4 Sep 1998 19:15:50 GMT Last-Modified: Fri, 4 Sep 1998 19:15:56 GMT Cache-Control: max-age=94043 ... |
后续抓取工具条件请求:条件请求基于上一个请求中保存的前提条件标头值。这些值会发送回服务器,以便在 If-None-Match 和 If-Modified-Since 请求标头中进行验证。
|
GET /hello.world HTTP/1.1 Host: www.example.com Accept-Language: en, hu User-Agent: Googlebot/2.1 (+http://www.google.com/bot.html) If-None-Match: "34aa387-d-1568eb00" ... |
GET /hello.world HTTP/1.1 Host: www.example.com Accept-Language: en, hu User-Agent: Googlebot/2.1 (+http://www.google.com/bot.html) If-Modified-Since: Fri, 4 Sep 1998 19:15:56 GMT ... |
服务器对条件请求的响应:由于服务器端会验证抓取工具发送的前提条件标头值,因此服务器会向抓取工具返回 304 HTTP 状态代码(没有 HTTP 正文)。后续的每个请求都会发生这种情况,直到前提条件验证失败(服务器端的 ETag 或 Last-Modified 日期发生更改)为止。
|
HTTP/1.1 304 Not Modified Date: Fri, 4 Sep 1998 19:15:50 GMT Expires: Fri, 4 Sep 1998 19:15:52 GMT Vary: Accept-Encoding If-None-Match: "34aa387-d-1568eb00" ... |
HTTP/1.1 304 Not Modified Date: Fri, 4 Sep 1998 19:15:50 GMT Expires: Fri, 4 Sep 1998 19:15:51 GMT Vary: Accept-Encoding If-Modified-Since: Fri, 4 Sep 1998 19:15:56 GMT ... |
如果您想让用户满意,并节省托管费用,请与您的托管/CMS 提供商或开发者讨论如何为您的网站启用 HTTP 缓存。无论如何,至少您的用户会更加满意。
如果您想讨论缓存问题,请前往距您最近的搜索中心帮助社区;如果您对我们的缓存方式有任何意见,请在与本博文一同发布的关于缓存的文档中留言反馈。
想详细了解抓取?请查看整个“抓取 12 月”系列:
井上坚二
Google 搜索团队 查看 Kenji Inoue 在 Google 搜索中心博客上发布的博文。
Aaseesh Marina
产品支持经理 Aaseesh Marina 是 Google 的 Search Console 产品支持经理。他专注于帮助网站所有者获取所需支持,提高其网站在 Google 搜索中的曝光率。 他曾是 Google 搜索质量团队的一员,该团队负责评估 Google 搜索结果的质量,并保护用户免受网络垃圾和其他类型的滥用行为的影响。 请查看他在 Google 搜索中心博客上发布的博文。 Twitter
Adrian Gregory Lui
新闻合作伙伴关系经理 查看 Adrian Gregory Lui 在 Google 搜索中心博客上发布的博文。 LinkedIn
Adriana Porter Felt
Chrome 安全团队 在 Google 搜索中心博客上查看 Adriana Porter Felt 发布的博文。
Alan Kent
开发技术推广工程师 在 Google 搜索中心博客上查看 Alan Kent 发布的帖子。 Twitter
Aldrich Christopher
政策透明度 查看 Aldrich Christopher 在 Google 搜索中心博客上发布的博文。 Twitter | LinkedIn | YouTube
Alissa Roberts
搜索质量团队前成员 查看 Alissa Roberts 在 Google 搜索中心博客上发布的博文。 LinkedIn
Amir Rachum
Search Console 软件工程师 查看 Amir Rachum 在 Google 搜索中心博客上发布的博文。 网站
Andrei Pascovici
网站站长工具团队 查看 Andrei Pascovici 在 Google 搜索中心博客上发布的博文。
Anna Ogawa
高级搜索生态系统顾问 查看 Anna Ogawa 在 Google 搜索中心博客上发布的博文。 Twitter | LinkedIn
Asaph Arnon
软件工程师经理 查看 Asaph Arnon 在 Google 搜索中心博客上发布的博文。 LinkedIn
Aurora Morales
信任与安全 Aurora 在 Google 信任与安全团队工作。多年来,她一直致力于向业界传授产品政策和准则,协助相关人员为各种受众群体打造更安全的生态系统。 一些让她忙不停的项目:管理英语和西班牙语的搜索中心帮助社区;向发布商受众群体介绍 Google 的创收政策和限制;吸引关键意见领袖关注虚假信息等风险和滥用领域。 网站 | LinkedIn | X/Twitter Aurora 还与搜索中心团队合作开展了多个 多媒体项目 ,例如 YouTube 系列视频 Sustainable
Candice Denic
产品经理 查看 Candice Denic 在 Google 搜索中心博客上发布的帖子。 LinkedIn
Chris Nelson
搜索质量团队 查看 Chris Nelson 在 Google 搜索中心博客上发布的博文。 LinkedIn
Cory Benavente
视频搜索产品经理 查看 Cory Benavente 在 Google 搜索中心博客上发布的博文。 LinkedIn
Daniel Yosef
软件工程师 在 Google 搜索中心博客上查看 Daniel Yosef 发布的帖子。 LinkedIn
Danielle Marshak
视频搜索产品经理 查看 Danielle Marshak 在 Google 搜索中心博客上发布的博文。 LinkedIn
Danny Sullivan
Google 搜索公共联络员 查看 Danny Sullivan 在 Google 搜索中心博客上发布的博文。 Mastodon
Duy Nguyen
搜索质量分析师 查看 Duy Nguyen 在 Google 搜索中心博客上发布的博文。
Earl J. Wagner
软件工程师 查看 Earl J. Wagner 在 Google 搜索中心博客上发布的博文。 LinkedIn
Edu Pereda
Google 搜索开源团队 查看 Edu Pereda 在 Google 搜索中心博客上发布的博文。 LinkedIn | GitHub | Mastodon | Twitter
Eiji Kitamura
Chrome 开发技术推广工程师 在 Google 搜索中心博客上查看 Eiji Kitamura 发布的帖子。 网站 | Twitter | GitHub | Mastodon | LinkedIn
Eric Silva
产品经理 查看 Eric Silva 在 Google 搜索中心博客上发布的博文。 LinkedIn
Fan Zhang
软件工程师 查看 Fan Zhang 在 Google 搜索中心博客上发布的博文。
Giacomo Gnecchi Ruscone
信任与安全合作伙伴关系 Giacomo 当前致力于在解决儿童安全、虚假信息和金融欺诈等关键现实问题方面展开合作关系,打造更安全的 Google 服务,并希望使互联网环境更加安全。查看 Giacomo Gnecchi Ruscone 在 Google 搜索中心博客上发布的博文。 Twitter
Greg Grothaus
搜索质量团队资深软件工程师 查看 Greg Grothaus 在 Google 搜索中心博客上发布的博文。 网站
Ian Hung 洪翊恩
搜索生态顾问 在 Google 搜索中心博客上查看 Ian Hung 洪翊恩发布的帖子。 LinkedIn
Irina Tuduce
软件工程师 查看 Irina Tuduce 在 Google 搜索中心博客上发布的博文。 LinkedIn
Jennifer Granito
新闻质量团队的统筹产品经理 Jennifer Granito 是 Google 新闻质量团队的组合产品经理。她目前是 Google 搜索、Google 新闻应用以及 Google 其他服务的新闻质量和可信度方面的产品主管。她致力于让用户获取高质量的新闻内容,帮助所有人了解世界。 此前,她曾在 Google 收购的初创公司 Kifi 工作,主要负责将知识性的内容提供给用户,帮助他们更好地了解、利用和拓展原有的知识。除了 Kifi,她还曾供职于
Jeremy Weinstein
Google 网站站长 查看 Jeremy Weinstein 在 Google 搜索中心博客上发布的博文。 LinkedIn