返回博客列表

接入CDN后百度和Google抓取异常,怎样检查状态码和拦截规则?

CdnChart 技术团队发布于 2026-10-0314 分钟阅读
接入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

页面正文、验证码、noindex

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: 120

Google明确建议,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规则修改后,建议按这个顺序验证:

  1. 清理受影响URL、robots.txt和站点地图的错误缓存。

  2. 用普通User-Agent测试状态码和正文。

  3. 用Googlebot和Baiduspider User-Agent做初步对比。

  4. 检查CDN安全日志,确认没有继续触发拦截。

  5. 使用Google网址检查测试实际网址。

  6. 使用百度抓取诊断重新抓取。

  7. 观察抓取统计、服务器日志和索引报告。

  8. 检查不同地区和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