外贸站做完 CDN 加速后,先不要把缓存命中或模拟
OAI-SearchBot、PerplexityBot请求返回200当成抓取成功。真正要复测的是同一批公开 URL 在 CDN 边缘、WAF、源站、重定向、缓存和正文层面有没有发生非预期变化。
这篇只讲 CDN、DNS 或代理层改造后的单次回归复测,不重写 CDN 配置、Cloudflare 规则、ChatGPT 爬虫区别或 PerplexityBot 基础准入。
先记录 CDN 改造改变了什么
“做 CDN 加速”可能不只是把静态文件放到边缘缓存。外贸站改动时,常见变化包括:
| 变化 | 可能影响的检查点 |
|---|---|
| DNS 或代理切换 | 域名是否到达预期边缘,证书和 Host 是否正确 |
| 页面缓存规则 | HTML 是否缓存旧版本,登录或个性化页面是否被错误缓存 |
| WAF / Bot 规则 | 403、挑战、限速或安全动作是否变化 |
| 回源协议和 Host | 源站返回的站点、语言或路径是否错误 |
| HTTP/HTTPS 跳转 | 是否出现多跳、循环或跳到测试域名 |
| 压缩、重写和响应头 | 正文、canonical、robots 或内容类型是否被改坏 |
先把变更编号、上线时间、涉及域名和回滚负责人记下来。没有改造前的基线,改造后即使出现异常,也很难判断是 CDN 新增问题还是旧问题被发现。
固定一批回归 URL
不要只测首页。至少固定这些公开入口:
https://www.example.com/
https://www.example.com/products/
https://www.example.com/products/industrial-valve/
https://www.example.com/faq/
https://www.example.com/case-studies/
https://www.example.com/request-a-quote/
https://www.example.com/robots.txt
https://www.example.com/sitemap.xml
如果网站有德文、法文或其他主要语言,还要给每种语言保留一个产品页和一个分类页。样本的作用不是覆盖全站,而是验证 CDN 变更有没有破坏核心入口。
每个 URL 都应记录:
- 页面类型;
- 是否应该公开访问;
- 改造前状态码和最终 URL;
- 改造前响应头和正文标记;
- 改造后状态码、缓存状态和正文标记;
- 是否有源站日志或边缘事件线索。
先看响应头,不要只看浏览器
浏览器能打开,不等于所有请求路径都正常。先从公网边缘响应中能看到的响应头开始抽查:
PAGE="https://www.example.com/products/industrial-valve/"
curl -sSL \
-D - \
-o /dev/null \
"$PAGE" |
grep -Ei \
'^(HTTP/|location:|content-type:|cache-control:|age:|etag:|vary:|server:|x-cache:|cf-cache-status:)'
不同 CDN 的字段不一样。CF-Cache-Status、X-Cache、Age 等字段只能作为当前 CDN 处理的线索,不能假设所有站点都会返回同样的字段。
建议保存 CDN 改造前后的响应头:
PAGE="https://www.example.com/products/industrial-valve/"
curl -sSL -D "headers-after.txt" -o /dev/null "$PAGE"
对比时重点看:
| 项目 | 要确认什么 |
|---|---|
| 状态码 | 产品页是否从预期状态变成 403、429 或 5xx |
location |
是否跳到错误域名、登录页或首页 |
content-type |
HTML、XML、PDF 是否仍为预期类型 |
cache-control |
是否错误缓存了本应动态或受保护的内容 |
| 缓存标记 | 是否命中、未命中、绕过或动态响应 |
vary / etag |
不同请求是否可能拿到错误版本 |
server / 请求 ID |
是否能和边缘或源站记录关联 |
缓存命中只说明边缘返回了缓存对象;缓存未命中也只说明这次没有直接命中缓存。都不能单独证明请求一定到达源站,或者页面已经被某个平台抓取。
对比普通请求和带 AI User-Agent 的模拟请求
可以做三组对照:
- 普通浏览器 User-Agent;
OAI-SearchBot字符串;PerplexityBot字符串。
下面的命令只用于比较当前规则对不同请求头的表现:
PAGE="https://www.example.com/products/industrial-valve/"
for item in \
"browser|Mozilla/5.0" \
"oai-search|OAI-SearchBot/1.0" \
"perplexity|PerplexityBot/1.0"; do
label="${item%%|*}"
ua="${item#*|}"
printf '\n== %s ==\n' "$label"
curl -sSL \
-A "$ua" \
-D - \
-o /dev/null \
"$PAGE" |
grep -Ei \
'^(HTTP/|location:|content-type:|cache-control:|age:|vary:|x-cache:|cf-cache-status:)'
done
-A 只是本地修改 User-Agent 字符串。它不能证明请求来自 OpenAI 或 Perplexity,也不能代替平台官方 IP、DNS 或其他身份核验。
OpenAI 的 OAI-SearchBot 和 GPTBot 用途不同;Perplexity 的 PerplexityBot 和 Perplexity-User 也不是同一类访问。本文只用搜索相关 User-Agent 做响应差异复测,不把模拟请求当成真实平台日志。
检查 robots.txt 和 sitemap 有没有被 CDN 缓存旧版本
CDN 上线后,robots 和 sitemap 也可能继续返回旧缓存。它们不是普通静态文件的附带检查,而是核心入口配置:
SITE="https://www.example.com"
printf '%s\n' '== robots headers =='
curl -sSL -D - -o /dev/null "$SITE/robots.txt" |
grep -Ei '^(HTTP/|age:|etag:|cache-control:|x-cache:|cf-cache-status:)'
printf '%s\n' '== robots body =='
curl -sSL "$SITE/robots.txt" |
sed -n '1,160p'
printf '%s\n' '== sitemap headers =='
curl -sSL -D - -o /dev/null "$SITE/sitemap.xml" |
grep -Ei '^(HTTP/|content-type:|location:|age:|cache-control:|x-cache:|cf-cache-status:)'
对比内容时,检查:
- 是否还出现测试域名、旧域名或旧目录;
- 公开产品、FAQ、案例和 RFQ 说明页是否被新规则误挡;
- sitemap 是否混入
404、测试 URL、参数 URL 或非规范 URL; - XML 或 robots 文本是否被缓存成旧版本;
- 语言版本是否跳到了错误的主机或路径。
如果只是刚发布的配置没有在边缘更新,不要直接全站关闭 CDN。先确认缓存键、刷新范围、源站文件和变更记录,再做最小范围的刷新或回滚。
判断异常发生在边缘、缓存还是源站
这一步只服务于本次 CDN、DNS 或代理改造的前后对照,不重新讲 WAF 规则配置。把同一个 URL 的公网响应、缓存状态、重定向和源站记录放在一起看:
| 观察结果 | 回归复测时要确认 |
|---|---|
公网返回 403、429 或 5xx |
是改造后的边缘响应,还是源站原本就这样 |
| 公网显示缓存命中,源站没有对应新请求 | 是否仍在返回改造前的旧对象 |
| 源站收到请求,但公网内容或状态不同 | 是否存在回源、Host、重写或响应处理差异 |
产品页返回首页 200 |
是否发生错误 Host、重写或软错误 |
Cloudflare 等平台可能在日志中提供边缘、缓存和源站响应线索,但字段、覆盖范围和可用性取决于当前服务配置。记录本次变更前后的请求 ID、时间和 URL即可,不要把某个仪表盘没有记录理解成“没有请求”。
如果你有授权的源站测试入口,可以做边缘与源站对照:
PUBLIC_URL="https://www.example.com/products/industrial-valve/"
ORIGIN_URL="https://origin.example.internal/products/industrial-valve/"
printf '%s\n' '== public edge =='
curl -sSL -D - -o /dev/null "$PUBLIC_URL" |
grep -Ei '^(HTTP/|location:|content-type:|cache-control:|age:|x-cache:|cf-cache-status:)'
printf '%s\n' '== authorized origin check =='
curl -sSL -D - -o /dev/null "$ORIGIN_URL" |
grep -Ei '^(HTTP/|location:|content-type:|cache-control:|server:|x-request-id:)'
origin.example.internal 是占位符。该命令只适用于企业已提供、允许直接访问且已配置正确 Host/SNI 的源站测试入口。源站直连结果不能单独证明 CDN 到源站的真实回源行为,也不能作为绕过 CDN 或访问控制的方法。不要把源站地址、证书信息或内部响应头放到公开文章和共享工单里。
检查返回的是正文,不是挑战页或旧页面
状态码正常还不够。对产品页、FAQ、案例页和 RFQ 说明页抽查正文标记:
PAGE="https://www.example.com/products/industrial-valve/"
BODY="/tmp/cdn-regression-page.html"
curl -sSL "$PAGE" -o "$BODY"
grep -Ein \
'industrial valve|model|material|pressure|application|rfq|request a quote' \
"$BODY" |
sed -n '1,40p'
if grep -Eqi \
'access denied|challenge|enable javascript|checking your browser|origin error' \
"$BODY"; then
printf 'ANOMALY\tchallenge_or_error_marker\t%s\n' "$PAGE"
fi
关键词需要替换成实际页面中的型号、材质、应用和询盘说明。一个产品页返回 200,但正文是挑战页、默认模板或首页内容,仍然属于回归异常。
用复测表收口
URL,页面类型,请求标记,状态码,最终URL,Content-Type,缓存状态,正文标记,边缘事件,源站日志,异常,处理结果
https://www.example.com/products/industrial-valve/,产品页,浏览器,待检查,待检查,待检查,待检查,待检查,待检查,待检查,,
https://www.example.com/products/industrial-valve/,产品页,OAI-SearchBot字符串,待检查,待检查,待检查,待检查,待检查,待检查,待检查,,
https://www.example.com/products/industrial-valve/,产品页,PerplexityBot字符串,待检查,待检查,待检查,待检查,待检查,待检查,待检查,,
https://www.example.com/robots.txt,robots,浏览器,待检查,待检查,待检查,不适用,规则文本,不适用,不适用,,
https://www.example.com/sitemap.xml,sitemap,浏览器,待检查,待检查,XML,不适用,URL范围,不适用,不适用,,
如果 CDN 改造后出现异常,按“定位层级、保存证据、最小修复、同样本复测、必要时回滚”的顺序处理。不要因为一个模拟 User-Agent 返回异常,就直接全站关闭 WAF 或开放所有 AI 爬虫。
CDN 加速后的 AI 抓取入口复测,验证的是当前访问链路:边缘有没有错误缓存,WAF 有没有非预期动作,源站是否收到请求,公开页面是否返回正确正文。它不等于 ChatGPT 或 Perplexity 已经抓取、索引、引用或带来询盘。