现场是这样的。为了让下载目录不进搜索结果,在 Nginx 里给 /uploads/ 加了 X-Robots-Tag,结果连正文里嵌的产品说明书 PDF 一起消失,site 查询从两千多条掉到几十条。

中间走过弯路,把「add_header 在 if 块里失效,实际生效的是更外层的继承规则」当成主因,改完现象没变。

真正麻烦的地方在于,几个原因的现象几乎一样。location 匹配的是 /uploads/,把图片和文档整目录一起盖住了;头里写的是 noindex 而不是 nofollow,浏览器打开的每个 PDF 都被标了;回流后的文件放在子目录,规则没区分年份目录。

上来先查响应头里到底有没有这个字段

curl -sI https://www.example.com/uploads/2026/manual.pdf | grep -i x-robots

接着改成只对指定目录追加头

location ^~ /uploads/private/ { add_header X-Robots-Tag "noindex" always; }

剩下的就是逐条验证放行后的头

curl -sI https://www.example.com/uploads/2026/manual.pdf | grep -ci x-robots

别只看报错消失,验证要多做一步。普通文档的响应头里不再有 X-Robots-Tag,私有目录仍然返回 noindex,GSC 里被排除的 PDF 数量停止增长并开始回升。

提醒一点。add_header 一旦出现在某个 location 里,父级的头就不再继承,写规则时要顺手确认没把上层的安全头一起覆盖掉。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189