现场是这样的。站点是 Next.js 15 的 App Router 项目,客户端导航会发带 ?_rsc= 随机串的请求。WAF 把下划线开头的参数当成注入特征,直接返回 403,日志里这类请求一天两千多条。蜘蛛渲染后只拿到骨架,正文是空的,GSC 一直报内容为空。
中间走过弯路,把「页面依赖客户端取数,蜘蛛必须执行 JS 才能看到正文」当成主因,改完现象没变。
把日志和配置对完,能解释这个现象的基本就这几处。WAF 的注入规则把下划线开头的高熵参数判成攻击特征;RSC 请求头没有进白名单,边缘把它们当成普通异步接口;动态路由没有做预渲染,首屏 HTML 里本来就没有内容。
从日志里把 _rsc 请求单独筛出来看状态码
awk '$7~/_rsc=/{print $9}' access.log | sort | uniq -c
接着放行带 RSC 头的请求,只对 GET 生效
Sec-Fetch-Dest: empty
随后把详情页改成静态生成或增量再生成,保证首屏有正文
export const revalidate = 600;
剩下的就是用抓取工具关掉 JS 再取一次,确认正文在 HTML 里
curl -s -A 'Mozilla/5.0 (compatible; Googlebot/2.1)' https://www.example.com/p/1024 | grep -c '<article'
怎么算真的好了,看的是同一批现象。关掉 JS 抓取也能拿到完整正文,日志里 _rsc 的 403 消失,索引报告里的内容为空提示随之减少。
补一句。放行 WAF 规则只能救客户端导航,救不了首屏,框架层面不做预渲染的话,蜘蛛永远看到空壳。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
