知识库文章

Googlebot收到304没有正文,页面出问题了吗?

文章摘要
304通常表示客户端已有的页面副本仍可使用,空正文是正常协议行为。内容已修改却仍返回错误304时,应核对ETag或Last-Modified及缓存层,而非把所有304改成200。

本页阅读目录

条件缓存验证:304重用已有表示,内容更新依赖验证器随实际表示变化

Googlebot收到304、响应里没有正文,通常是正常的缓存验证。服务端在说:你手里的那份页面仍然有效,可以继续用。空正文正是304应有的行为,不能只凭这个状态码认定页面抓取失败。

需要处理的情形是:页面关键内容确实变了,服务器却还告诉客户端“旧副本没变”。下面先读一轮完整请求,再看怎样分辨正常重用与错误缓存。

读一轮请求,就能理解304

第一次请求页面,服务端返回200及HTML,同时给这份内容一个ETag,例如"cup-v1"。ETag是服务端提供的版本标识,实际值通常由服务器生成,不要求一定长得像版本号。

客户端之后可以带上If-None-Match: "cup-v1",问服务器:“如果现在仍是这一版,就不用再传全文。”当标识匹配,服务端返回304,没有页面正文;客户端使用先前保存的内容。

这时的“没有正文”不等于“页面为空”。客户端本来就有正文,双方只是在确认能否继续使用。Google的抓取缓存说明确认其基础设施支持这类条件请求,但不能据此假定每次Google抓取都会发送相同条件。

下图来自本地教学端点的真实请求。第一次200有内容,第二次带相同ETag得到304且body为0字节。演示请求由本地脚本发出,并非Googlebot抓取本站的记录。

教学HTTP端点首次200有正文,带相同ETag再次请求返回304且没有正文
原创HTTP实验。展示协议行为,不展示真实搜索引擎的抓取状态。

服务器也可以使用Last-Modified和If-Modified-Since按修改时间验证。两组条件同时出现时,If-None-Match有优先级。先把现场实际使用的那一组记录下来,不必为了凑“最佳配置”随意改主机规则。

照着做一次对照,别先改服务器

让维护者对同一个公开URL做两次GET。下面以保留域名example.com示范,执行前替换为自己有权检查的地址。命令按Bash终端的curl写法演示;Windows可在Git Bash中执行,使用PowerShell时需改用curl.exe并核对实际发出的请求头:

curl -sS -D first.headers -o first.html "https://example.com/cup/"

first.headers保存响应头,first.html保存正文。打开头文件,记录状态码、ETag、Last-Modified及Cache-Control;如果中间有跳转,先记录Location并确认最终页面地址,再对最终地址做同口径测试,不把跳转页的标识当产品页标识。

假设首次响应中的ETag确实是"cup-v1",第二次才带这个值:

curl -sS -D second.headers -o second.html -H 'If-None-Match: "cup-v1"' "https://example.com/cup/"

如果页面未变化,304和空的second.html是正常结果。curl不会凭这条命令自动拿第一次的文件来显示页面;浏览器的缓存行为与这两个独立文件也不相同。

网站没有ETag时,不要自己编一个塞进去。可以让维护者依据实际Last-Modified做日期条件测试,或先确认缓存层是否支持验证器。ETag不存在本身不能证明SEO故障。

测试期间保持URL、登录状态、设备相关请求头和内容版本一致。一个登录后报价页与访客公开页,不一定是同一种表示,不能交叉拿验证器比较。

正文改过了,为什么仍然304

继续这个杯子页的教学例子:把正文里的说明从版本一改为版本二。现在仍带旧标识"cup-v1"请求,应取得新的内容和相应验证结果。下面的教学端点用新ETag"cup-v2"返回200;再带新标识请求才得到304。

教学页面更新后旧ETag得到200和新正文,新ETag才得到304
实际运行的本地版本更新实验;生产环境的ETag值由自己的服务器决定。

如果你更新了正文,条件请求却仍304,先做一次不带条件的GET。如果连无条件返回的正文都还是旧内容,更可能是源站或中间缓存仍在提供旧页,需要沿CDN、主机缓存、WordPress页面缓存继续定位。

如果无条件GET已拿到新正文,旧ETag请求却304,要让维护者检查验证器的生成和比较逻辑:是否只按文件路径生成恒定标识,动态内容更新是否触发它变化,代理是否使用了过期元数据。使用弱ETag时还要核服务器认为哪些变化算等价,不能仅靠肉眼看到页脚日期变化就推断协议有错。

还有一种常见偏差是看错对象。带www与不带www、参数页与基础页、移动版和桌面版可能经过不同规则。把每次请求的准确地址、时间和响应头留在一起,比笼统说“清过缓存仍无效”更便于维护者重现。

WordPress缓存的具体设置可看缓存配置教程。本次只改造成旧表示或错误验证器的那一层,不需要为了消灭304全站关闭缓存。

什么时候交给主机,什么时候等搜索数据

一份足够用的交接记录包括:受影响URL、修改的具体内容、修改时刻和时区、首次200的验证器、第二次请求条件、响应状态及当前正文是否已更新。涉及登录Cookie、鉴权字段或个人信息的内容先脱敏。

在教学例子里,协议检查的完成条件是:首次200能取到当前正文;未变化时相同验证器得到304;关键正文更新后,旧条件不再错误地被判作未变化。维护者能沿同一URL重做这三步,才算修复证据完整。

协议正确后,再看GSC记录的最后抓取时间与Google已获取的内容。它可能尚未发生新抓取,也可能抓取与索引处理之间还有时间差。不要用当前curl结果声称“Google已经更新索引”,也不要把正常304计数下降当SEO增长目标。

304的用途是减少不必要传输。保留正确的重用,让真正更新能被识别,比把每次响应强行变成200更符合这个目的。完整机制可对照MDN条件请求。

常见问题

访问日志里304很多,会导致不收录吗?

数量本身不能回答。先确认这些条件响应是否对应未变化内容,关键更新能否返回新表示,再结合真实抓取和索引记录判断。正常缓存验证不是页面为空的证据。

浏览器显示200,日志却有304,谁对?

可能是不同请求,也可能浏览器使用缓存后展示了完整页面。按时间、URL和请求条件对齐原始响应,不用地址栏里页面能打开来覆盖服务器日志。

加上Cache-Control就一定能让Google少抓吗?

不能保证抓取次数或时点。缓存策略、验证器和客户端行为共同决定重用方式;不要把单个响应头当成控制Google抓取频率的开关。

关于跨境YOUNG

跨境YOUNG整理WordPress建站、Google SEO与AI SEO / GEO方法,并提供建站、代运营和顾问服务。

需要有人持续推进SEO?

网站已上线,但页面、内容、技术、内链和月度数据没有持续推进?可先诊断范围与优先级,再按月执行与复盘。

最具性价比的服务器

Hostinger 适合预算有限的新站和中小企业 WordPress 网站,托管、备份与基础性能配置比较完整。通过专属链接可享 20% 折扣,购买前再核对机房位置和续费价格。

专属链接含 20% 折扣;跨境YOUNG可能获得佣金,不会增加你的购买成本。