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 月”系列:
抓取 12 月:CDN 和抓取
2024 年 12 月 24 日,星期二 内容分发网络 (CDN) 特别适合用于缩短网站的延迟时间,并且通常可以避免与网站流量相关的麻烦。毕竟,它们的主要用途是:即使网站获得大量流量,也能快速传送内容。CDN 中的 "D" 是指在全球范围内传送或分发内容,因此传输到用户的时间也比仅在某个数据中心托管内容更短。在本文中,我们将探讨如何利用 CDN 来提升网站的抓取速度和用户体验,还将了解抓取 CDN 支持的网站时的一些细微差别。 CDN
抓取 12 月:分面导航
2024 年 12 月 17 日,星期二 我们刚刚发布了 关于分面导航最佳实践的新文档 ,该文档 最初发布为一篇博文 。 以下是新文档页面中的一些重要内容的摘要。 分面导航是一种非常棒的方式,可帮助用户在您的网站上找到所需内容,但如果不谨慎实施,可能会演变为一场 SEO 噩梦。为什么?因为它可以生成近乎无限数量的网址,从而导致:
抓取 12 月:Googlebot 抓取的运作方式和原因
2024 年 12 月 3 日,星期二 您可能听说过,Google 搜索需要完成一些工作,才能在 Google 搜索结果中显示某个网页。其中一个步骤称为“抓取”。Google 搜索上的抓取工作是由 Googlebot 完成的。Googlebot 是 Google 服务器上运行的一款程序,用于检索网址,并处理在遍历整个网络时可能遇到的网络错误、重定向和其他小问题。但是,有些细节并不常被提及。在本月的每周,我们都会探讨这些细节的一部分,因为这些细节可能会对您网站的被抓取方式产生重大影响。 抓取