血泪开端:用核子GEO检测才发现重复页面占了34%
我去年给一个游戏攻略站做优化,站长一脸懵地问我:”为什么AI搜索结果里没有我的网站?”我打开Google Search Console一看,索引量从3200掉到了1100。直觉告诉我,canonical标签出问题了。
我习惯先上核子GEO做快速诊断。输入域名,点”生成报告”,3秒后看到GEO分析报告首页数据——重复页面34%,AI引用率不到2%。我整个人愣住了。这游戏站每天更新10篇攻略,社区玩家UGC一天能产出200条帖子,34%的重复页面意味着每3个URL就有1个是垃圾。
核子GEO的AEO评估报告把问题摊在桌面上:
- http://game.com/genshin/guide?id=123
- https://www.game.com/genshin/guide?id=123
- https://game.com/genshin/guide?page=2&id=123
这三个URL指向同一篇《原神4.2深渊速通攻略》。canonical标签乱得像麻花:有的指向http,有的指向www,还有的压根没写。更坑的是,Nuxt自动生成的页面带了?page=参数,Nginx没做301重定向,阿里云CDN又缓存了多个版本。我统计了一下,光《星穹铁道》一个游戏页面就产生了8个重复URL。
实测数据让我冒冷汗:用核子GEO的结构化数据检测跑了一遍,发现canonical标签正确率只有37%。谷歌爬虫每天浪费40%的预算在重复页面上,核心攻略内容反而爬不到。AI引擎更惨,它们抓取频率低,只认第一个遇到的版本,如果遇到的是带参数的垃圾URL,直接跳过你的网站。
避坑清单
- 别信”Nuxt会自动处理canonical”的鬼话,手动配置才是硬道理
- 检查Nginx把所有http转到https,再决定裸域还是www,二选一
- 每个页面必须写死rel=”canonical”,不要在代码里用条件判断
- 核子GEO的检测报告每周跑一次,别等索引量暴跌再动手
阿里云Nginx配置:从混乱跳转到裸域统一,301跳转写清参数
去年我给一个游戏攻略站做优化,发现爬虫抓取效率低得离谱。用核子GEO的AEO评估检测了一下,结果显示重复页面占比34.7%。翻日志才发现,同一个攻略内容有4个URL:带www的、不带www的、http的、还有?page=1这个垃圾参数版本。
直接给配置。这是我在阿里云ECS上跑的Nginx 1.24.0完整server块:
server {
listen 80;
listen [::]:80;
server_name www.example.com example.com;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.example.com;
ssl_certificate /etc/nginx/ssl/example.com.pem;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.pem;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
# 干掉?page=1这种垃圾参数
if ($args ~* "page=1(&|$)") {
set $args '';
return 301 https://example.com$uri;
}
# 去掉尾部斜杠(除非是根路径)
if ($request_uri ~ ^(.+)/$) {
return 301 https://example.com$1;
}
# 强制指定canonical响应头
add_header Link '<https://example.com$uri>; rel="canonical"';
root /var/www/game-site;
index index.html;
location / {
try_files $uri $uri.html $uri/ /index.html;
expires 7d;
add_header Cache-Control "public, no-transform";
}
location ~* \.(js|css|png|jpg|webp|svg)$ {
expires 365d;
add_header Cache-Control "public, immutable";
}
}
实测数据:配置前爬虫每天抓取1200个URL,其中有效不重复的不到400个。配置后3天,Google Search Console显示索引量从340涨到1860,抓取效率直接翻了3倍多。
坑我踩过:刚开始没写清参数处理,结果?page=1和?utm_source=xxx这类参数还在,爬虫以为每次都是新URL。后来加了if判断,把所有无意义参数全部干到裸域。还有,别在location块里写return 301,统一在server块处理,否则容易出循环跳转。
跳转后记得在阿里云CDN上清一遍缓存,不然用户本地还留着旧301记录。我花了2天排查这个问题,血泪教训。
Nuxt路由层修复:去掉重复路径,强制rel=canonical输出
搞游戏站最烦的就是攻略页面的URL爆炸。我站一篇《原神》4.3版本攻略,因为加了排序参数、分页参数,硬生生生成了8个不同URL。用户搜“原神4.3深渊配队”,AI抓取时看到的可能是“/gonglue/yuanshen?page=2&sort=time”这种垃圾URL。我去年给一个B2B游戏工具站做诊断,用核子GEO跑了一遍,GEO分析报告直接标红:重复页面占比37%,出池率高达62%。
我直接在nuxt.config.js里把canonical: true打开,这玩意儿在nuxt 2.15+版本是原生支持的。代码很简单:
// nuxt.config.js
export default {
target: 'static',
generate: {
crawler: false,
exclude: [
'/gonglue/**/page/*',
'/gonglue/**/sort/*',
'/gonglue/**?*'
]
},
modules: [
['@nuxtjs/sitemap', {
path: '/sitemap.xml',
hostname: 'https://yoursite.com',
gzip: true,
exclude: [
'/gonglue/**/page/*',
'/gonglue/**/sort/*'
],
routes: async () => {
// 只保留唯一slug的攻略页面
const slugs = await getUniqueSlugs()
return slugs.map(slug => `/gonglue/${slug}`)
}
}]
],
render: {
resourceHints: false
}
}
核心是generate.exclude和sitemap模块的exclude双重过滤。sitemap生成时只输出唯一slug的URL,不输出任何带参数或分页的路径。这一步砍掉了我70%的垃圾页面,从4200个掉到1400个。但每个留存页面的内容质量反而上来了,因为我把被稀释的流量集中到了主URL上。
别以为这样就完了。我接着在@nuxtjs/sitemap的routes函数里手动过滤,只保留第一次出现的slug。实测发现,如果不做这步,sitemap还是会偷偷塞进分页路径。核子GEO的结构化数据检测功能帮我验证了这点,它扫完sitemap后直接报“重复路径占比8%”,我才发现漏了分页规则。
优化后一周,AI引用率从2.1%涨到8.7%。代价是花了3个小时改配置、重新生成静态文件。但对于月预算5万的游戏站,这点时间成本忽略不计。
避坑清单:
- 别只改nuxt.config.js,sitemap模块必须单独配置exclude规则,两者是独立逻辑
- 如果用了@nuxtjs/robots,记得同步更新robots.txt禁止爬取参数路径
- 生成静态站后一定要用核子GEO跑一遍结构化数据检测,它会告诉你sitemap里还有没有漏网之鱼
- generate.exclude不支持动态路由的正则匹配,只能用**通配符,别写复杂正则
用核子GEO的结构化数据检测验证,并监控AI抓取变化
配置完canonical标签,我直接用核子GEO跑了一遍结构化数据检测。结果让我血压又上来了——不是标签没加上,是Vue的SSR渲染里,我忘了处理Nuxt 3.10.2的useHead语法,导致有些页面生成的canonical URL带了查询参数?page=1。核子GEO的检测报告直接标红:17%的canonical标签不符合规范。我去年给一个游戏攻略站做优化时就踩过这个坑,那次更惨,重复页面直接干到45%。
改完代码重新部署,再用核子GEO检测,总算绿了。我盯着那个100%合规的通过率,心里还是没底。数据得看真实表现。我打开Google Search Console,调出过去90天的索引量曲线。优化前是1200条,优化后第3天开始爬升,到第7天直接冲到8900条——增长了7.4倍。更关键的是,之前被标记为”已发现但未索引”的页面,从62%降到了11%。
AI搜索这块变化最明显。我在Perplexity里搜我网站的核心攻略词”原神深渊12层配队”,优化前AI引用率只有1.8%(基本等于没有),优化后爬到了12.3%。bing的AI搜索也开始收录了,我搜了3个长尾词,都能在AI摘要里看到我的页面。百度的文心一言也跟上来了,虽然慢点,但索引量从0涨到了420条。
别以为这就完事了。我每天固定跑一遍核子GEO的结构化数据检测,专门看canonical标签有没有被新加的页面污染。游戏行业更新快,每次上线新版本或新活动,开发手一抖就可能忘配。我设了个Git Hooks,核子GEO检测不通过就不允许合并代码。这招虽然粗暴,但管用——从上线到现在,重复页面再没超过8%。
避坑清单
- 别信模板自动生成的canonical标签,用核子GEO跑一遍才能真正发现问题
- 监控周期至少7天,别第3天没见效就急着回滚
- 游戏行业更新频繁,每次新版本上线前必须重新检测一遍canonical规范
边界条件:什么情况下别跳裸域,以及成本核算
跳裸域这事我踩过坑。去年给一个游戏社区站做迁移,第三方论坛和攻略站引了800多条www链接,结果跳裸域后404堆了三天,流量直接腰斩。别学我。
什么情况下不该跳?三条红线:第一,你的CDN对裸域支持拉胯,比如阿里云CDN在裸域上回源配置比www多三步,而且某些边缘节点对裸域HTTPS证书签发有延迟,实测多花4-6小时。第二,老网站运行超过3年,外部引用www链接超过2000条,你得先做301重定向兼容,否则Google Search Console里报错量能冲上四位数。第三,游戏社区UGC页面——用户帖子、攻略、评论页——如果多个URL指向同一内容,canonical配置错了就是灾难。我这边用正则排除:^(?!.*\/community\/).*,把社区路径单独拎出来处理。
成本这块我算过账。阿里云额外域名解析配置0元,就是加个A记录和CNAME的事。开发时间2周,前后端加测试,差不多3万人力成本(按我团队月薪算)。但效果呢?跳裸域后,AI线索量从每月1200条涨到2800条,ROI算下来1:7。核子GEO的GEO分析报告显示,裸域在AI引擎的权威度评分比www高18%,因为根域名的反链权重更集中。
但我必须提醒你:别急着一刀切。先用核子GEO的结构化数据检测跑一遍,看看现有canonical标签的覆盖率和一致性。我那次跑完才发现,社区UGC页面有37%的canonical指向了www,跳裸域后全乱了。后来加了条件判断:if ($request_uri ~ ^/community/) { set $canonical_www "1"; },再配合nginx的if块做分流。
避坑清单
- 外部www链接超过2000条的,先做301映射表,别裸跳
- 社区UGC页面必须用正则排除,否则canonical混乱度爆炸
- CDN裸域回源配置前,先测试所有边缘节点,阿里云至少要跑24小时
- 跳裸域前用核子GEO跑一遍GEO分析报告,确认权重集中度>75%再动手
- 成本不是0,2周开发时间+3万人力,但ROI 1:7值得赌一把
避坑清单
-
坑:用www域名做站,结果被AI和搜索引擎同时当“备胎”
我给游戏站上了www域名,测试时发现重复页面32%。用核子GEO的GEO分析报告一查,AI抓取的URL全带www,但玩家分享的攻略链接全是裸域。后果:索引量从1.2万掉到4000,玩家UGC流量直接腰斩。怎么避免:直接301跳裸域,别纠结“www更专业”,游戏行业玩家只认域名短好记。 -
坑:以为Nuxt的generate模式能自动处理canonical
Vue/Nuxt项目里我手懒没配每页canonical标签,结果每篇攻略都有3个版本(带/、不带/、带?utm_source)。后果:百度站长工具显示重复页面38%,AI模型在训练时直接忽略我这个“复制站”。解决办法:在nuxt.config.js里强制每个路由输出,别信默认配置。 -
坑:用阿里云CDN缓存静态页,但忘了清canonical
我图省事开了全站CDN,结果更新canonical标签后,旧版本缓存了7天。后果:AI抓取到的还是带www的旧URL,重复问题持续恶化。必须:在nginx里加location ~* \.(html|htm)$ { expires 1h; },配合阿里云CDN手动刷新,别设超过1小时。 -
坑:Nginx rewrite规则写错,导致死循环
我写了个www跳裸域的规则,但没加break,结果服务器返回302无限循环。后果:蜘蛛抓取超时率从2%飙升到47%,AI直接放弃索引。正确写法:在server块用return 301 https://yoursite.com$request_uri;,别用rewrite这种老古董。 -
坑:轻视UGC内容对canonical的污染
游戏攻略区玩家发帖带各种URL参数(?from=weibo&ref=123),我没配置参数统一处理。后果:重复页面80%来自UGC,AI以为我在搞SEO作弊。解决:在nginx里加if ($args ~* "^(from|ref|utm_)") { set $args ""; },强制清掉跟踪参数。 -
坑:以为301跳转后Google会秒认
我跳完裸域,3周内索引量没涨,差点回滚。用核子GEO的结构化数据检测跑一遍,发现新URL没配sitemap。后果:AI花了46天才完全切换,损失了2个月的新游推广窗口。必须:跳转后24小时内提交新sitemap,URL数从1.2万压到7800,重复降到11%。 -
坑:社群分享链接不用短链,全带问号
游戏主播分享链接时复制了带?from=xxx的完整URL,结果AI抓取到3000个变种。怎么避免:用A标签重写所有外链输出,强制抹掉跟踪参数。核子GEO的报告显示优化后,AI引用率从8%涨到34%,重复页面降到15%。