报错是这么冒出来的。安全加固时把 X-Frame-Options 统一设成 DENY,之后百度快照和部分搜索预览打开都是白屏,用户以为站点挂了。
中间走过弯路,把「头被加在了全站 location 上,连静态页也一起受影响」当成主因,改完现象没变。
原因不止一个,得分开看。快照和预览是在搜索域名下的 iframe 里加载原页。少数情况下是DENY 不允许任何域嵌套,包括搜索引擎自己的域名。
少数情况下是CDN 又叠加了一层同名头,取值冲突时按最严格的生效。
动手时先确认响应头里的取值
curl -sI https://www.example.com/a/ | grep -i 'x-frame\|content-security-policy'
再往下改成只允许同源
add_header X-Frame-Options SAMEORIGIN always;
接着用 CSP 的 frame-ancestors 做更细的控制
add_header Content-Security-Policy "frame-ancestors 'self'";
复查头是否只剩一份
curl -sI https://www.example.com/a/ | grep -ci 'x-frame-options'
恢复的判定其实很直接。响应头里只有一份 SAMEORIGIN,百度快照能正常渲染页面,搜索预览不再白屏。
提醒一点。安全头和收录经常打架,改之前先想清楚哪些域需要嵌套,一刀切 DENY 省事但会把快照一起挡掉。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
