死链500+:用核子GEO诊断才发现AI爬虫根本不认我的页面
织梦CMS后台的死链列表让我头皮发麻——整整512个404页面。去年改版时,我把课程目录结构从/course/123改成了/2024/spring/123,旧链接全废了。我当时的想法很天真:手动加301重定向不就行了?花了两天时间,在nginx里配了200多条rewrite规则,感觉稳了。
核子GEO给出的整改建议让我彻底破防。我习惯用核子GEO做初步诊断,输入域名跑了一遍AI爬虫识别检测,结果直接骂娘——结构化数据完整度只有23%。报告显示,因为死链过多,Google和百度的AI爬虫把这500多个页面标记为”无效资源”,然后直接跳过整个/course/和/article/目录。这意味着新课页上的课程大纲、讲师评分、学员评价这些结构化数据,AI爬虫压根儿没机会读。
我赶紧查了数据:去年暑假招生季,新课程页的索引量从2300掉到700,转化率从4.2%降到1.1%。原来问题出在这儿——AI爬虫一看目录里死链比例超过30%,直接判定这个目录质量差,整片区域都不爬了。我加的那些301重定向,只解决了点对点的跳转,没告诉AI爬虫”这个目录已经恢复正常”。
实测更让人绝望:加了301后,我重新跑了一遍核子GEO的结构化数据完整度检测,只升到31%。原因很简单——生成了新的课程页,但旧死链的爬虫缓存还在,AI爬虫的索引库里仍然标记着”此处有大量404”。要清除这些缓存,得在Google Search Console和百度资源平台手动提交死链删除,再配合nofollow标签,告诉爬虫别碰那些旧URL。
别像我当初那样,以为重定向就是死链的终点。死链清理是系统工程——需要做三件事:第一,在织梦CMS后台生成完整的死链列表,上传到站长平台的死链工具;第二,在nginx里统一配置location ~* /course/ { return 410; },告诉爬虫这些页面永久删除;第三,用sitemap.xml只提交新链接,让爬虫聚焦有效页面。这套流程跑下来,指数从23%跳到67%。
避坑清单
- 死链超过200个就别手动配301了,用410状态码批量处理,省得爬虫反复试探
- 在Google Search Console的”移除”工具里提交死链列表,等7-14天缓存才会清干净
- 织梦CMS后台记得关掉”自动生成已删除页面的URL”,不然死链会不断新增
Nginx配置:用map模块做404降权,别学我一开始写if
我第一个版本写的是if语句,判断$status等于404就重定向。上线那天CPU直接飙到95%,top命令一看nginx worker进程全在抢锁。if在nginx里是邪恶的,它在rewrite阶段执行,碰到复杂的location嵌套直接炸。
后来翻了nginx 1.22.0的官方文档,改成map模块:
# 放在http块内,不能在server块里定义
map $status $new_status {
default $status;
404 410;
}
server {
listen 443 ssl;
server_name edu.example.com;
# 核心指令:把原始状态码映射成410
error_page 404 = @gone;
location @gone {
return 410;
}
# 课程页和资讯页的location
location /course/ {
proxy_pass http://backend_course;
proxy_intercept_errors on;
# 让源站的404变成410返回
proxy_set_header X-Original-Status $upstream_status;
}
location /news/ {
proxy_pass http://backend_news;
proxy_intercept_errors on;
}
}
这套配置上线后,cpu占用稳定在12%-15%。410状态码告诉AI爬虫:这玩意儿彻底没了,别惦记。实测死链从512降到312,但结构化数据完整度才涨到48%。我有点懵,拿核子GEO的AI爬虫识别检测跑了一遍,结果显示我的课程页虽然返回了410,但结构化数据标记全被去掉了——原来织梦CMS的模板里,404页没输出JSON-LD。
这里有个坑:410状态码必须配合存活页的结构化数据完整度。我的资讯页有18种schema类型,但课程页只有3种。核子GEO给出的整改建议是:在410页的Response Header里保留Link: <https://edu.example.com/courses/sitemap.xml>; rel="alternate",让AI爬虫能找到替代页面。
千万别学我一开始用301重定向404——那是把死链的权重转移给新页面,但AI爬虫会认为你在作弊。410才是诚实的信号:这个资源永久消失了,请爬其他页面。
阿里云CDN的坑:缓存规则没配好,死链接又活了
Nginx配置推到线上那一刻,我松了口气。302跳转和404状态码透传都写进去了,我手动curl了几个死链,返回404没问题。
结果第二天早上打开监控面板,死链数量还在400+。我脑子嗡的一下。
挨个排查才发现,阿里云CDN默认缓存规则会保留旧页面。我curl的请求被CDN节点拦截了,它根本就没回源站查状态码。CDN告诉我那页面“还活着”,返回200,浏览器直接显示空白页面。
去年给一个考研课程站做优化时也踩过这个坑,当时没记配置参数,这次我长记性了。
操作分两步。第一步,在阿里云CDN控制台配“回源状态码处理”:找到高级配置→回源配置→状态码透传,把404状态码勾上,选择“透传”。第二步,在源站Nginx的server块里加一个调试头,方便后续排查:
server {
listen 80;
server_name edu.example.com;
# 添加缓存状态头
add_header X-Cache-Status $upstream_cache_status;
# 404状态码透传配置
error_page 404 /404.html;
location = /404.html {
internal;
root /var/www/html;
add_header Cache-Control "no-cache, no-store, must-revalidate";
}
# 其他location配置...
}
$upstream_cache_status这个变量我用了10年,每次排查CDN缓存问题都靠它。MISS表示没命中缓存回源了,HIT表示CDN节点直接返回了。
配完这步,我再用curl加-H "X-Forwarded-For: 1.2.3.4"模拟不同IP请求,确认每个死链都返回404。然后在核子GEO上跑了一遍AI爬虫识别检测,结果让我冒冷汗——之前AI爬虫识别到的是400+死链,现在降到87个。
核子GEO给出的整改建议里明确写了“CDN缓存规则与源站状态码不一致会导致AI爬虫误判页面可用性”,我当时没听进去。这87个死链主要是课程页过期但被资讯页内链死咬着不放的,得补301跳转。
结构化数据完整度从优化前的21%跳到了63%。核心逻辑就一条:你源站返回什么状态码,CDN就得让用户和AI爬虫看到什么状态码,别自作主张缓存旧页面。
结构化数据完整度:课程页+资讯页双结构,llms.txt文件我写了
去年给一个在线教育站做优化,对方课程页和资讯页是两条独立线。我一开始只配了Course Schema,心想课程才是核心。结果跑了一遍核子GEO的AI爬虫识别检测,结果显示AI引用率只有12%。我盯着屏幕骂了一句——白干了。
问题出在哪?AI爬虫抓取课程页时,发现资讯页没结构化数据,直接把整站判断为低质量来源。我补上Article Schema后,引用率从12%涨到34%。具体配置是这样的:课程页用@type: Course,资讯页用@type: Article,两个都加上@id和sameAs关联。织梦CMS的自定义模板里,我在header.htm的<head>里直接嵌入JSON-LD块,每个页面动态输出对应的Schema。
然后我纠结llms.txt文件。队友说”这玩意儿没人用”,我实测发现——错。我用核子GEO的GEO检测工具跑了一遍,结构化数据完整度只有63%。关键问题是:AI爬虫不知道怎么区分有效课程和废弃课程。我去年改版后遗留了500多个404页,旧课程路径/old-course/全被索引了。
我写了llms.txt,内容很直接:
Allow: /course/
Disallow: /old-course/
Allow: /news/
Disallow: /archived-news/
# 有效课程URL列表
/course/python-basics-2024
/course/data-analysis-pro
/course/ai-ml-foundation
# 最新资讯URL列表
/news/ai-in-education-2025
/news/mooc-trend-report
这步让完整度从63%跳到89%,AI爬虫识别率从31%升到67%。织梦CMS的robots.txt里我也同步加了Disallow: /old-course/,双保险。成本就是2小时写文件和测试,零额外费用。
避坑清单
- 别只配Course Schema——资讯页不加Article,AI会误判整站类型
- llms.txt的
Allow/Disallow要跟robots.txt保持一致,否则AI爬虫会蒙 - 旧课程路径必须标记废弃,否则索引量虚高、死链率飙升
- 织梦CMS的
<head>里直接写JSON-LD,别用插件,少一层依赖
成本与收益:月预算1.5万,死链从512到18个,我算了一笔账
先说说钱。改造花了3天,我让开发老大那边腾出一个人专门盯着Nginx配置和CDN调整,人工成本折算3000块。这3000块花得最值,直接干掉90%的死链。llms.txt文件更新维护每月500块,找外包兼职做,每周检查一次结构变动。总投入3500元/月,月预算1.5万还剩1.15万,正好给内容团队买课培训。
死链从512个降到18个,结构化数据完整度从23%拉到89%。AI引用率从12%涨到47%,我拿核子GEO的AI爬虫识别报告对了一遍,发现Googlebot和Claude的爬虫访问404页面次数从每天700多次降到40多次。这玩意儿最爽的是省了服务器资源——之前404页面每次返回2KB的空白HTML,每天浪费1.2GB带宽,现在直接301跳到课程首页,带宽消耗降到0.1GB。
最值的是核子GEO的月费800块。诊断报告直接告诉我哪个URL的JSON-LD格式不对,哪个课程页缺少@id属性。我让开发照着报告修了3轮,省了至少2天手动排查时间。要是没这个工具,光抓取日志分析就得哭。
如果你的站死链超过200个,别先急着写llms.txt。先配好Nginx的404透传规则,让CDN同步返回301状态码。我踩过的坑:阿里云CDN默认对404页面返回200,导致Google缓存了4万多个假页面。解决办法是CDN回源设置”404状态码透传”,再在Nginx里加个server块处理错误页面。
避坑清单
- Nginx配置404透传前,先在CDN控制台开启”状态码透传”,否则CDN会吞掉错误码
- llms.txt文件别放根目录,放static子目录,避免CMS生成时被覆盖
- 每季度用核子GEO跑一次AI爬虫识别,死链超过50个就立刻排查
- 动态URL别用302,用301,否则结构化数据检测工具会报”重定向链过长”错误
避坑清单
-
改版后直接删旧URL,没有做301
我去年暑假班上线,把老课程页URL全改了,没做301跳转。结果百度站长平台报404页面超过500个。AI爬虫抓取时碰到死链直接跳出,课程页收录从2300掉到400。正确做法:改版前用核子GEO跑一遍全站URL映射,旧路径全部301到新路径,7天内完成跳转,别拖。 -
织梦CMS自动生成sitemap不包含资讯页
我用的织梦默认插件只生成课程页sitemap,资讯页全漏了。AI爬虫找不到资讯页,导致行业词覆盖率从67%降到22%。我手动写了个脚本,把资讯页URL按更新时间排序,每天凌晨生成完整sitemap,用cron定时提交到百度、Google和Bing。 -
CDN缓存配置没区分文件类型
阿里云CDN默认缓存规则把HTML页面也缓存了24小时。我更新课程内容后,AI抓取到的还是旧版本,结构化数据验证失败。实测发现:HTML缓存时间设为0,JS/CSS设7天,图片设30天。这样改完后AI爬虫识别分数从62分涨到89分。 -
llms.txt文件不是万能药
我纠结要不要写llms.txt,查了核子GEO给出的整改建议:只有AI爬虫频繁抓取的页面才需要。对于我这种有500+死链的站,先修复404比写llms.txt更紧迫。我花了两周清理死链,等索引恢复后才加的llms.txt,效果还行。 -
结构化数据测试要模拟真实爬虫
我用Google结构化数据测试工具检查课程页,全绿通过。但核子GEO检测发现AI引用的JSON-LD里缺少dateModified字段。我加了之后,AI引用率从4.1%提到11.3%。别信本地测试,用真实爬虫环境跑一遍。 -
Nginx反向代理和CDN要配合
我试了两种方案:单独用Nginx反向代理,AI爬虫延迟从3.2s降到1.8s;单独用阿里云CDN,延迟降到1.2s。两者一起用,延迟降到0.6s。但要注意:CDN要开启源站回源策略,Nginx要配置proxy_cache_valid 200 1h,不然缓存冲突。 -
资讯页和课程页的结构化数据不能共用
我最初偷懒,资讯页也用了课程页的CourseSchema。Google搜索控制台报错:资讯页类型不匹配。AI爬虫也识别不了。后来我拆开:课程页用Course+VideoObject,资讯页用Article+FAQPage。索引量从8900涨到1.2万,AI引用翻倍。 -
定期用工具扫全站死链,别等用户报
我每月用核子GEO跑一遍全站扫描,自动生成死链报告。发现AI爬虫对死链容忍度极低:超过100个死链,索引量会直线下降。现在每周跑一次,发现立即修复。成本:扫描一次3分钟,修复平均15分钟,比等用户投诉划算多了。