问题出现得很突然,日志倒是留得挺全。主域是 www.example.com,另有一条 bak.example.com 的 A 记录留着做容灾,源站 Nginx 没给它单独写 server_name,默认站点直接返回同一份内容,状态码 200。半年后 site 查询两个域名各有六万条收录,同一篇文章两个地址都在。试过只在首页加跳转,内页还是 200。
刚开始盯着「正文里的绝对地址混着备用域名,蜘蛛顺着这些链接爬过去」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。备用域名的解析和虚拟主机都没关,源站对它照样返回 200。另一种情况是301 只写在首页入口,内页走的是默认 server 块。
不容易想到的是,canonical 覆盖不到备用域名下的页面,两边互不承认。
动手时先确认备用域名的解析与返回码
dig +short bak.example.com; curl -sI http://bak.example.com/post/123 | head -3
给它单独建 server 块做全站 301
server { listen 80; server_name bak.example.com; return 301 https://www.example.com$request_uri; }
接着检查正文里残留的备用域名
mysqldump wp_posts | grep -c 'bak.example.com'
末了清解析前先看还有多少请求
grep -c 'Host: bak.example.com' /var/log/nginx/access.log
改完先别撤,确认这几项。备用域名任意内页都只返回一次 301 且 Location 保留原路径,日志里该域名的 200 归零,两个月后 site 查询里的重复条目逐步消失。
容灾域名不用时把解析删掉比留着跳转更干净,留着就等于一份完整副本随时可能被重新发现。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
