接入CDN后百度和Google抓取异常,怎样检查状态码和拦截规则?
网站接入CDN后,普通用户访问正常,百度搜索资源平台或者Google Search Console却开始出现抓取异常。
常见表现包括:
服务器错误(5xx)
网页无法访问
已发现但尚未抓取
抓取频率下降
robots.txt无法获取
网址检查返回403
百度抓取诊断失败
索引页面逐渐减少很多站长会先检查网站首页,发现浏览器能够正常打开,就认为搜索引擎抓取应该也没问题。
但浏览器正常,不代表百度和Google看到的结果也正常。
CDN、WAF和Bot防护系统可能根据访问者的IP、地区、User-Agent、访问频率、Cookie和JavaScript执行能力返回不同内容。普通用户得到200,搜索引擎蜘蛛却可能得到403、429、503,甚至是一张状态码为200的验证码页面。
因此,真正要检查的是:
百度和Google发出请求时,CDN最终返回了什么状态码和什么内容?
搜索引擎抓取经过了哪些层?
接入CDN以后,搜索引擎抓取页面通常会经过:
Googlebot或Baiduspider
↓
DNS解析与CDN调度
↓
CDN边缘节点
↓
Bot管理、WAF、频控和地区规则
↓
缓存
↓
源站Web服务器
↓
网站程序任何一层都可能让抓取失败。
例如:
DNS把蜘蛛调度到异常节点
CDN不允许蜘蛛所在地区访问
WAF把高频抓取识别成攻击
Bot管理要求执行JavaScript验证
频率限制返回429
CDN回源失败并返回502或504
缓存中保留了旧的403页面
robots.txt被CDN规则拦截
源站根据User-Agent返回不同内容
所以,“接入CDN后不收录”并不能直接证明CDN影响SEO。必须先用状态码、响应内容和日志确定具体故障。
先检查几个最重要的URL
不要只检查首页。至少测试下面这些地址:
https://www.example.com/
https://www.example.com/robots.txt
https://www.example.com/sitemap.xml
一篇已经收录的文章
一篇新发布的文章
一个出现抓取异常的具体URL
页面引用的主要CSS和JavaScript先查看普通请求的状态码:
curl -sS -D - -o /dev/null \
https://www.example.com/article再保存完整响应:
curl -sS -D response-headers.txt \
-o response-body.html \
https://www.example.com/article需要检查的不只是第一行的状态码,还包括:
Location
Retry-After
Server
Via
Age
X-Cache
X-Robots-Tag
Content-Type
CDN请求ID
WAF事件ID如果状态码为200,还要打开response-body.html查看内容,确认返回的是正常文章,而不是:
Access Denied
Checking your browser
Please enable JavaScript
Human Verification
Request blocked
网站维护中状态码正常但内容是错误页,仍然可能影响抓取和索引。
不同状态码对抓取意味着什么?
状态码 | 搜索引擎看到的结果 | 优先检查 |
|---|---|---|
200 | 成功获取内容,但内容仍可能是验证码或软404 | 页面正文、验证码、 |
301/308 | 永久跳转 | 目标地址和跳转链 |
302/307 | 临时跳转 | 是否错误跳到首页、登录页或验证页 |
401 | 需要认证 | CDN访问控制、源站鉴权 |
403 | 明确拒绝访问 | WAF、地区封禁、IP规则、Bot规则 |
404/410 | 页面不存在 | URL、缓存、路由和发布状态 |
429 | 请求过多 | CDN频控、Bot限速、源站限流 |
500 | 源站内部错误 | 应用和服务器日志 |
502 | CDN收到异常上游响应 | 回源协议、端口、连接 |
503 | 服务暂时不可用 | 过载、维护、无健康源站 |
504 | CDN等待源站超时 | 应用、数据库和回源超时 |
Google说明,持续出现的5xx以及429会使其抓取系统暂时降低抓取速度;持续返回服务器错误的URL最终可能退出索引。
网络超时、连接重置和DNS错误虽然没有HTTP状态码,也会被Google视为严重的可用性问题。
200状态码也可能是抓取异常
最隐蔽的情况不是403,而是CDN返回:
HTTP/2 200 OK
Content-Type: text/html页面内容却是:
正在验证您的浏览器……
请完成验证码……
访问过于频繁……对普通用户来说,浏览器执行JavaScript、写入Cookie后可能自动进入网站;但搜索引擎抓到的可能只是验证页面。
这种响应也可能被判断为软404或错误内容。
Google专门提醒过,CDN如果返回随机错误页面却使用200状态码,会让搜索系统难以正确理解页面状态。
因此,检查时必须同时比较:
HTTP状态码
页面标题
页面正文
Content-Type
canonical
robots meta
X-Robots-Tag正常用户和蜘蛛请求之间的内容差异
例如搜索响应内容中的特征:
curl -sS https://www.example.com/article |
grep -Ei 'captcha|access denied|checking your browser|noindex'如果页面应该是一篇文章,返回内容却只有几KB的验证代码,就不能因为状态码是200而认为抓取正常。
用User-Agent做一次初步对比
可以模拟Googlebot和Baiduspider的User-Agent,观察CDN是否返回不同结果。
测试普通请求:
curl -sS -D normal-headers.txt \
-o normal-body.html \
https://www.example.com/article模拟Googlebot:
curl -sS -D googlebot-headers.txt \
-o googlebot-body.html \
-A 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)' \
https://www.example.com/article模拟Baiduspider:
curl -sS -D baiduspider-headers.txt \
-o baiduspider-body.html \
-A 'Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)' \
https://www.example.com/article比较响应头:
diff normal-headers.txt googlebot-headers.txt
diff normal-headers.txt baiduspider-headers.txt比较响应正文:
diff normal-body.html googlebot-body.html
diff normal-body.html baiduspider-body.html如果普通请求返回200,而模拟蜘蛛返回403或验证页面,就要检查针对User-Agent设置的规则。
但这里有一个重要限制:
修改User-Agent只能发现基于User-Agent的差异,不能模拟搜索引擎真实的来源IP、ASN、地区和访问行为。
因此,curl -A Googlebot请求正常,并不能证明真正的Googlebot没有被IP规则拦截。
不要只通过User-Agent放行搜索引擎
User-Agent很容易伪造。
任何请求都可以声称自己是:
Googlebot
Baiduspider如果WAF只要看到这个字符串就直接绕过所有安全规则,攻击者同样可以利用这条规则。
正确方式是验证来源IP。
如何验证Googlebot
Google官方建议使用以下方式之一:
把访问IP与Google公布的抓取工具IP范围进行匹配
对来源IP执行反向DNS查询,再对得到的域名执行正向DNS查询,确认结果回到原IP
Google官方提供的验证过程是:
host 66.249.66.1得到类似:
crawl-66-249-66-1.googlebot.com再正向查询这个主机名:
host crawl-66-249-66-1.googlebot.com确认结果与原始IP一致。
Google说明,仅检查User-Agent并不可靠,应该使用IP范围或正向、反向DNS验证。
如何验证Baiduspider
从服务器或CDN日志中找到来源IP后,可以执行:
host 123.125.66.120百度官方文档说明,Baiduspider的主机名通常使用*.baidu.com或*.baidu.jp格式,并建议通过DNS反查判断抓取来源。
为了降低伪造反向DNS的风险,实际配置白名单时还应确认解析结果和原始IP一致,不要只匹配主机名字符串。
如果CDN提供“已验证搜索引擎机器人”或“Verified Bot”能力,优先使用厂商维护的验证机制,而不是手工维护多年不更新的IP名单。
接入CDN后最常见的七类拦截规则
1. Bot管理要求执行JavaScript验证
某些CDN会向可疑请求返回JavaScript挑战或验证码。
普通浏览器可以执行JavaScript并保存Cookie,搜索引擎抓取工具却不一定能通过这种挑战。
检查CDN控制台中的:
Bot管理
浏览器完整性检查
JavaScript Challenge
Managed Challenge
验证码规则
人机验证对于经过验证的Googlebot和Baiduspider,应避免返回交互式验证页面。
2. WAF把高频抓取识别成扫描攻击
搜索引擎可能在短时间内连续访问多个页面。
WAF可能因为以下特征触发规则:
单个IP访问页面过多
请求之间间隔很短
大量访问不同URL
没有Cookie
不加载图片
请求头与普通浏览器不同
连续访问站点地图中的新页面
日志里通常会看到:
403
429
WAF Block
Rate Limit
Bot Score
Request Rate Exceeded不要直接关闭整个WAF。应该先找到具体规则,再针对经过验证的搜索引擎请求调整动作。
3. 地区封禁误伤Googlebot
有些网站只面向中国大陆用户,于是在CDN中直接封禁海外IP。
但Googlebot的抓取请求可能来自网站没有开放的地区。如果地区规则在搜索引擎验证之前执行,就可能导致Google抓取403。
同样,部分面向海外用户的网站会屏蔽中国大陆IP,从而影响Baiduspider。
需要检查:
国家和地区访问控制
海外访问限制
仅允许中国大陆
仅允许指定国家
数据中心IP封禁
ASN封禁
代理和云主机封禁搜索引擎抓取器经常使用数据中心网络。如果规则直接封禁所有云服务商或数据中心IP,也可能误伤正常蜘蛛。
4. 频率限制返回403而不是429
如果服务器确实因为压力需要临时限制抓取,更合适的状态码通常是:
429 Too Many Requests或者:
503 Service Unavailable
Retry-After: 120Google明确建议,CDN需要临时阻止抓取时,可以使用429或503,让抓取系统知道这是暂时状态。
不要用403表达“现在太忙,请稍后再试”。403更像是明确拒绝访问,不适合用来控制抓取频率。
5. IPv6蜘蛛没有进入白名单
如果搜索引擎通过IPv6访问,而WAF白名单只包含IPv4,可能出现:
IPv4抓取正常
IPv6抓取403或超时需要确认:
CDN日志是否记录IPv6来源
白名单是否同时支持IPv4和IPv6
源站是否错误地限制CDN IPv6回源地址
防火墙是否只放行了旧的IPv4节点段
搜索引擎验证逻辑是否支持IPv6
不要为了省事关闭整个IPv6。先根据日志确认异常请求使用的地址类型。
6. HEAD请求或特殊方法被拦截
部分搜索工具、监控程序或者资源验证请求可能使用HEAD。
如果CDN只允许GET和POST,HEAD请求可能收到403或405。
测试:
curl -I https://www.example.com/article并对比GET:
curl -sS -D - -o /dev/null \
https://www.example.com/article如果GET返回200,HEAD返回403或405,需要确认是网站有意限制,还是CDN规则误拦截。
7. CDN缓存了旧的403或5xx响应
站点刚接入CDN时,如果源站防火墙还没有放行回源请求,CDN节点可能先获取到403或502。
后来源站配置已经修复,但节点仍然返回旧错误页。
检查:
curl -I https://www.example.com/article重点看:
Age
X-Cache
Cache-Status
CDN厂商特有缓存字段如果403、404或5xx显示缓存命中,需要检查错误状态码缓存规则,并刷新受影响URL。
不要一开始就刷新全站。先刷新一个问题页面和robots.txt,验证是否确实是缓存导致。
robots.txt必须单独检查
搜索引擎访问网站时,通常会先获取:
https://www.example.com/robots.txt直接检查:
curl -sS -D - \
https://www.example.com/robots.txt正常情况下应该看到:
HTTP/2 200
Content-Type: text/plain以及符合预期的规则,例如:
User-agent: *
Disallow:
Sitemap: https://www.example.com/sitemap.xml需要警惕:
robots.txt返回403
robots.txt返回429或5xx
robots.txt跳转到登录页
robots.txt返回验证码页面
CDN缓存了旧版robots.txt
不同地区返回不同robots.txt
错误配置了
Disallow: /HTTP与HTTPS版本内容不同
带
www和不带www使用不同规则
百度搜索资源平台说明,Baiduspider会先访问网站根目录的robots.txt,并根据其中规则确定抓取范围。
Google也强调,robots.txt主要用于管理抓取,而不是可靠地阻止URL出现在搜索结果中。
因此,robots.txt能返回200还不够,内容本身也要正确。
检查页面有没有被意外加上noindex
CDN响应头规则可能给整个目录甚至全站添加:
X-Robots-Tag: noindex网站模板中也可能存在:
<meta name="robots" content="noindex,nofollow">检查响应头:
curl -sS -D - -o /dev/null \
https://www.example.com/article |
grep -i 'x-robots-tag'检查HTML:
curl -sS https://www.example.com/article |
grep -i 'robots'尤其要检查:
正式站是否继承了测试环境配置
CDN是否为某个路径统一添加
X-Robots-Tag移动版和桌面版是否不同
错误页面是否被缓存成正常页面
不同User-Agent是否得到不同robots标签
抓取成功和允许索引不是同一件事。
页面返回200,但包含noindex,搜索引擎仍可能不会收录。
绕过CDN对比源站结果
如果怀疑CDN修改了状态码或内容,可以绕过CDN访问源站。
假设:
网站域名:www.example.com
源站IP:203.0.113.10通过CDN请求:
curl -sS -D cdn-headers.txt \
-o cdn-body.html \
https://www.example.com/article绕过CDN请求源站,同时保留正确的Host和HTTPS SNI:
curl -sS -D origin-headers.txt \
-o origin-body.html \
--resolve www.example.com:443:203.0.113.10 \
https://www.example.com/article然后比较:
diff cdn-headers.txt origin-headers.txt
diff cdn-body.html origin-body.html结果可以这样理解:
CDN结果 | 源站结果 | 优先排查 |
|---|---|---|
403 | 200 | CDN WAF、Bot管理、地区或频控规则 |
429 | 200 | CDN频率限制 |
503 | 200 | CDN节点、健康检查或边缘规则 |
验证页面200 | 正常文章200 | JS挑战或Bot防护 |
robots.txt禁止抓取 | 源站允许抓取 | CDN缓存旧robots.txt |
两边都是403 | 源站WAF、程序权限或访问控制 | |
两边都是5xx | 源站和应用故障 | |
CDN与源站内容不同 | 缓存、边缘重写或按UA返回内容 |
如果只有部分地区抓取异常,还可以使用CDNChart的网站测速工具,查看不同地区的状态码和访问结果。
如果不确定域名目前使用了哪家CDN或解析到哪些节点,可以先使用CDN检测工具检查CNAME和节点信息。
日志应该查什么?
只看源站访问日志可能不够。
如果请求在CDN边缘就被拦截,源站根本收不到请求。因此需要同时查看:
CDN访问日志
CDN安全事件日志
WAF拦截日志
Bot管理日志
频率限制日志
源站访问日志
源站错误日志
应用日志
建议按下面字段筛选:
时间
完整URL
User-Agent
来源IP
国家和地区
ASN
HTTP状态码
命中的安全规则
执行动作
CDN节点
请求ID
回源状态码
回源耗时如果源站日志只记录到CDN回源IP,还要通过CDN日志或可信的客户端IP字段查看真实来源。不要未经配置就完全信任客户端自行提交的X-Forwarded-For,否则日志和安全规则都可能被伪造。
使用Google和百度的官方工具复查
Google Search Console
修复后,可以使用:
网址检查
测试实际网址
页面索引报告
抓取统计信息
HTTPS报告
robots.txt相关检查
Google建议通过抓取统计信息查看Googlebot的抓取历史和网站可用性问题。
重点观察:
主机状态
按响应类型统计的抓取请求
5xx数量
抓取响应时间
Googlebot类型
异常开始时间百度搜索资源平台
可以使用百度搜索资源平台的抓取诊断,从Baiduspider视角查看:
能否连接网站
返回的状态
抓取到的页面内容
抓取IP是否正确
页面是否与普通用户看到的一致
百度对抓取诊断工具的说明指出,它可以用于检查网站与百度之间的连接,以及查看Baiduspider实际抓到的内容。
官方工具请求成功一次,不代表所有节点都完全恢复,但它可以证明至少当前诊断请求已经能够正常访问。
修复后不要马上判断“收录恢复了”
CDN规则修改后,建议按这个顺序验证:
清理受影响URL、robots.txt和站点地图的错误缓存。
用普通User-Agent测试状态码和正文。
用Googlebot和Baiduspider User-Agent做初步对比。
检查CDN安全日志,确认没有继续触发拦截。
使用Google网址检查测试实际网址。
使用百度抓取诊断重新抓取。
观察抓取统计、服务器日志和索引报告。
检查不同地区和IPv4、IPv6访问结果。
不要在规则修复后反复提交几千个URL,也不要期待索引量当天完全恢复。
搜索引擎需要重新抓取页面、重新处理内容。恢复速度取决于错误持续时间、受影响URL数量、网站抓取频率和页面质量,不能用一个固定天数判断。
常见问题
浏览器正常打开,为什么Google仍然抓取失败?
CDN可能根据IP、地区、User-Agent、访问频率或Cookie返回不同结果。浏览器正常只能证明你的访问条件没有触发规则,不能代表Googlebot得到相同响应。
模拟Googlebot返回200,就代表Google抓取正常吗?
不代表。curl -A Googlebot只能模拟User-Agent,不能模拟Google真实来源IP、网络和访问行为。还需要检查CDN日志、验证真实Googlebot IP,并使用Search Console测试。
应该把Googlebot和Baiduspider加入白名单吗?
可以对经过验证的搜索引擎爬虫降低不必要的Bot挑战和频控,但不要只根据User-Agent直接放行,也不要让白名单绕过所有高风险安全规则。
网站压力大时,可以用403限制蜘蛛吗?
不建议。临时过载更适合返回429或503,并根据情况提供Retry-After。403表达的是拒绝访问,不适合控制临时抓取压力。
robots.txt返回404会影响抓取吗?
不同搜索引擎对robots.txt不可用状态的处理可能不同。最稳妥的做法是让它稳定返回200和正确的纯文本内容,不要让CDN验证页、重定向链或WAF拦截影响该文件。
为什么只有百度抓取失败,Google正常?
可能是中国大陆节点、Baiduspider来源IP、地区规则或针对Baiduspider的WAF策略不同。也可能是百度和Google被调度到了不同CDN节点,应对比两者的日志、节点和响应内容。
为什么只有Google抓取失败,百度正常?
优先检查海外地区封禁、数据中心IP限制、IPv6规则和Bot挑战。Googlebot的访问来源和百度蜘蛛不同,即使访问同一个URL,也可能命中完全不同的CDN策略。
CDN返回403会立刻导致页面掉出索引吗?
不一定立刻发生,但持续无法抓取会影响搜索引擎更新页面内容和维持索引。越早确认拦截范围、修复规则并恢复稳定的200响应越好。
- Googlebot抓取失败
- Baiduspider抓取异常
- CDN影响百度收录
- CDN影响Google收录
- 蜘蛛访问403
- 搜索引擎抓取429
- CDN拦截爬虫
- WAF拦截Googlebot