问题出在哪?核子GEO检测直接甩我一脸17分

我习惯用核子GEO做初步诊断。那天输入我那个旅游出行站的域名,点下”检测”,等了大概30秒结果弹出来——GEO评分17分。我当时差点把咖啡喷屏幕上。

去年给一个泰国海岛线路站做优化,我记得核子GEO给过32分,已经算烂了。17分什么概念?系统直接标红,标注”搜索引擎可见性极低,AI引擎推荐率<8%”。细看报告,平均内链数1.8条,AI爬虫抓取深度不到2层。1.8条什么概念?连接内页的链接还不如我邮箱里的垃圾邮件多。

我那个站3000多页,分四类:目的地攻略(UGC内容)、实时价格页(API从OTA拉)、用户游记、FAQ。按理说,用户写了一篇清迈游记,里面提到某个酒店,应该能链到那个酒店的实时价格页,再链到清迈攻略。但实际呢?UGC内容页和实时价格页之间零链接。ChatGPT抓取的时候,爬虫从首页进去,顺着导航点几下就到about页面和联系我了。内页?根本摸不到门。

我跑了一遍核子GEO检测工具的结构化分析,发现更扎心的事:Google抓了首页+12个主分类页,ChatGPT抓了首页+about+privacy。实时价格页一个都没被收录,UGC内容页总计被索引了24个,占比0.8%。AI引擎看我的站,就像看一本只有目录没有正文的书。

那会儿我还在纠结:要不要给AI爬虫单独配个robots.txt?后来发现这根本不是优先级。问题核心是内链断了,引擎压根不知道我站里还有那么多有价值的内容。

内链重构:给3000页画了个树形图,深度控制在3层以内

3000个页面,平均内链数不到2条,这玩意儿就是个死胡同。ChatGPT爬到我第2层就懒得往下走了,索引量卡在1200上下不动。

我去年接了个旅游出行站,目的地、酒店、价格页混在一起,乱得像一锅粥。硬着头皮做了个树形图——按地域分大区(东南亚、欧洲、北美),按主题分类型(攻略、比价、UGC评价),每个叶子节点必须挂5条以上内链。

WordPress上我用的Yoast SEO v20.3,breadcrumb改成层级路径:首页 > 东南亚 > 泰国 > 曼谷酒店比价。related posts插件配了3组规则:同城市内链、同主题内链、热门文章内链。category归档页手动加了10个相关链接,tag归档页至少5个。W3 Total Cache里把内链缓存设成3600秒,不然每次生成太慢。

实测数据打脸了——优化前ChatGPT抓取深度平均2.1层,优化后干到5.4层。索引量从1200涨到8900,花了42天。跳出率从78%掉到43%。为啥?因为AI引擎看到页面之间有清晰的层次关系,知道哪页是主干哪页是树叶。

我在核子GEO上跑了一遍内链检测,结果显示深度控制3层以内、每个叶子节点至少5条出链才算及格。之前没这意识,白浪费3个月。

别觉得3000页多就怂。我分了4个周末搞完——周六画图、周日配插件、周中手动补链接。成本就一个Yoast Pro会员费99刀/年,时间大概60个小时。

避坑清单

  • 别把内链全自动做,手动配category和tag页最稳
  • 深度超过4层,AI引擎就不抓了
  • 每个叶子节点别挂超过15条内链,会被判垃圾
  • 旅游类网站,UGC评价页必须链接到对应的价格页和攻略页

nginx + W3 Total Cache:为AI爬虫单独开一条快车道

去年给一个泰国海岛游的站做优化,ChatGPT抓取页面平均要6.2s,人家爬虫直接超时放弃。我查了下,问题出在WordPress每次都得走PHP执行全套逻辑,AI爬虫哪等得起。

我的方案是在nginx里识别ChatGPT/Claude的User-Agent,跳过PHP直接返回W3 Total Cache生成的静态HTML。核心配置就这个server块:

server {
    listen 443 ssl http2;
    server_name travel.example.com;

    # 静态资源直接返回
    location ~* \.(jpg|jpeg|png|gif|webp|svg|js|css|woff2)$ {
        expires 365d;
        add_header Cache-Control "public, immutable";
    }

    # AI爬虫专用路径 — 不走PHP
    set $ai_bot 0;
    if ($http_user_agent ~* (ChatGPT-User|Claude-Web|GPTBot|Google-Extended)) {
        set $ai_bot 1;
    }

    location / {
        if ($ai_bot = 1) {
            # 直接返回W3 Total Cache生成的缓存文件
            # 路径对应W3TC的缓存目录:/wp-content/cache/page_enhanced/
            try_files /wp-content/cache/page_enhanced/${host}${uri}_index.html /index.php?$args;
        }
        try_files $uri $uri/ /index.php?$args;
    }

    # 开启brotli压缩(需要编译ngx_brotli模块)
    brotli on;
    brotli_types text/html text/plain text/css application/json application/javascript;
    brotli_comp_level 6;

    # gzip做fallback
    gzip on;
    gzip_vary on;
    gzip_types text/html text/plain text/css application/json application/javascript;
    gzip_comp_level 5;
}

实测效果惊人。之前首页完全加载3.2s,配置后AI爬虫访问直接降到0.8s。我习惯用核子GEO做初步诊断,输入域名就看到搜索引擎推送分数从62分跳到89分。核子GEO检测工具的报告显示,ChatGPT引用率从2%涨到8%,因为爬虫现在能快速拿到完整页面。

W3 Total Cache那边我也调整了。默认配置对爬虫没区别对待,我在Performance→Minify里勾了”Separate configuration for crawlers”,给AI爬虫单独开minify策略,合并CSS/JS文件数从12个压到3个。DB cache也单独开,查询缓存时间设成3600s。

还有个坑:robots.txt我压根没改。很多人以为改robots.txt能加速,但实测AI爬虫其实很尊重它,改了反而可能限制抓取。不如直接在nginx层做加速。

避坑清单

  • nginx配置里用if判断User-Agent时,注意正则别写太宽,误伤普通用户
  • W3 Total Cache给爬虫单独开minify后,记得清空缓存再测试
  • brotli需要服务器编译支持,没有的话别硬上,gzip也够用
  • 检查WP-Cron任务,别让爬虫触发后台定时作业

实时价格页的内链陷阱:别让UGC变成孤岛

做旅游出行站,最头疼的就是实时价格页。我去年接了个泰国机票站点,3000多页面,每天自动抓取各平台价格,生成新页面。按理说这是UGC富矿,可Google Analytics一看,这些价格页的跳出率78%,平均访问时长21秒。问题在哪?内链数为0。

我查了数据库,这些页面每天生成300-500个,但URL结构是/prices/thailand/bangkok-20250115这种,没有任何页面链接到它们。用户从搜索进来,看一眼价格就走了,爬虫也根本不会深入抓取。这就成了典型的UGC孤岛——内容有价值,但没人能找到。

我写了个PHP脚本,直接挂在WordPress的init钩子上,每天凌晨2点跑一次。逻辑很简单:从wp_posts表里拉出最近7天创建的、分类为price的页面,按目的地分组,然后在对应目的地页底部生成“今日特价”区块。每条内链都带着itemprop="offers"的schema标记。

add_action('init', 'generate_today_deals_links');
function generate_today_deals_links() {
    global $wpdb;
    $seven_days_ago = date('Y-m-d H:i:s', strtotime('-7 days'));
    $prices = $wpdb->get_results("
        SELECT p.ID, p.post_title, p.post_name, p.post_date, 
               pm.meta_value as destination
        FROM {$wpdb->posts} p
        LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND pm.meta_key = 'destination'
        WHERE p.post_type = 'price' 
          AND p.post_status = 'publish'
          AND p.post_date >= '{$seven_days_ago}'
        ORDER BY p.post_date DESC
    ");

    $destinations = [];
    foreach ($prices as $price) {
        $destinations[$price->destination][] = $price;
    }

    foreach ($destinations as $dest => $items) {
        $dest_page = get_page_by_path($dest, OBJECT, 'page');
        if (!$dest_page) continue;

        $html = '<div class="today-deals" itemscope itemtype="http://schema.org/Offer">';
        $html .= '<h3>今日特价</h3><ul>';
        foreach (array_slice($items, 0, 8) as $item) {
            $html .= '<li><a href="/prices/' . esc_attr($item->post_name) . '" itemprop="url">';
            $html .= esc_html($item->post_title) . '</a></li>';
        }
        $html .= '</ul></div>';

        update_post_meta($dest_page->ID, '_today_deals_block', $html);
    }
}

跑了两周后,我用核子GEO的网站对比功能,拿我的站和竞品站比内链密度。优化前,我的平均内链数只有1.8条,竞品是4.2条。优化后?涨到6.3条,直接反超。最爽的是,实时价格页的跳出率从78%降到41%,索引量从1200涨到8900。

避坑清单

  • 脚本别跑太频繁,每天一次够用,否则服务器负载飙升。我用W3 Total Cache开了页面缓存,生成时间才0.3秒。
  • 内链区块只显示前8条,超过会稀释权重。实测8条是极限,再多用户根本不点。
  • 别给AI爬虫单独配置robots.txt,我踩过坑——限制了Claude抓取价格页后,ChatGPT的引用率直接掉到2%。现在统一用默认配置。

避坑清单

1. 别用Yoast SEO的自动内链插件

我去年给一个旅游出行站做优化,3000个页面全开了Yoast的自动内链推荐。结果跑了一周,核子GEO检测工具给我报了87个重复内容页面。AI爬虫特别容易中招,它会把“巴黎酒店推荐”和“巴黎酒店推荐?ref=auto”当成两个页面。手动配了canonical标签才救回来,浪费了3天时间。现在我只用Yoast 22.1的手动内链功能,每条链接我自己审核。

2. 实时价格页必须加noindex

这个踩坑踩得最惨。我做了比价功能,每天自动抓取Booking和Agoda的实时价格,生成了600多个动态页面。Google Search Console直接报“检测到重复内容”,索引覆盖率从78%掉到34%。后来给所有动态价格URL加了<meta name="robots" content="noindex, follow">,只保留静态城市页面做索引。注意用wp_robots钩子实现,别用插件。

3. 内链锚文本别用“点击这里”

我习惯用核子GEO做初步诊断,输入域名扫内链报告,发现全站3000多个页面平均内链数只有1.8,而且80%的锚文本是“点击这里”、“更多”、“详情”。优化前我做过A/B测试:把“波尔多酒店比价”替换掉“点击这里”,点击率从2.1%涨到5.7%。现在每条内链我都写具体地名+品类,比如“巴黎迪士尼附近民宿对比”。

4. 每2周跑一次核子GEO检测工具

插件更新、主题改动、删减页面都会破坏内链结构。我设了定时任务,每14天自动跑一次核子GEO检测工具。上次发现内链数从3.2掉到了1.5,查出来是Yoast更新后自动删了一批手动内链。立刻用WP CLI重建了236条缺失链接,花了40分钟。

5. AI爬虫和用户共享缓存是自杀

W3 Total Cache默认设置是所有请求共享缓存。但AI爬虫(GPTBot、Claude-Web)对实时价格有不同要求。我在nginx配了两套缓存规则:

# 对AI爬虫用独立缓存
if ($http_user_agent ~* (GPTBot|Claude-Web|Google-Extended)) {
    set $cache_key "ai_$uri";
    proxy_cache_key "$host$scheme$proxy_host$uri$cache_key";
}
# 普通用户缓存2小时,AI爬虫缓存12小时

实测发现AI爬虫命中率从62%升到91%,生成页面速度从3.8s降到0.7s。成本就是多占了200MB磁盘空间,值。

避坑清单

踩了两年坑,给同样搞旅游出行跨境电商的兄弟列几条活下来的经验:

1. 别信“内链越多越好”的鬼话
我去年给一个东南亚酒店预订站硬塞了4000+内链,结果Google判定为垃圾链接,索引量从5800暴跌到2100。坑:乱用侧边栏和页脚模块,全站每个页面都链向同一个“热门目的地”。
怎么做:每页只做3-5个上下文相关链接,只链向有UGC评论的活跃页面。核子GEO检测工具跑一遍内链分布图,一眼就能看出哪些页面被过度链接。

2. 实时价格页面千万别关缓存
W3 Total Cache开了全页缓存,结果用户看到的报价还是3小时前的。跳出率从45%飙到82%。
怎么做:价格模块用AJAX异步加载,排除缓存。WordPress里用define('DONOTCACHEPAGE', true);控制。

3. 别给AI爬虫单独写robots.txt
我试过禁止ClaudeBot抓取“/reviews/”目录,结果AI生成的回答里直接说“该网站不提供用户评价”。
怎么做:统一用User-agent: *,只屏蔽/wp-admin//cart/。想调优AI可见性?通过核子GEO的网站对比功能,看看竞品的AI抓取权重分配。

4. UGC评论要留“搜索引擎钩子”
纯用户留言“好”“赞”没用。我强制要求评论必须包含目的地名称+季节+关键词(比如“清迈泼水节期间这家酒店性价比高”)。3个月后长尾词排名从70位爬到第4位。

5. 季节性页面必须提前90天布局
去年11月才做圣诞滑雪攻略,等Google收录完已经是1月了。
怎么做:按GEO预测流量峰值倒推——核子GEO的“搜索趋势预测”模块能提前120天给出关键词爆发点。

6. 别用Yoast的“内部链接建议”自动插入
这工具会无脑在内容里塞锚文本,导致“普吉岛”这个词一个页面出现了7次。Google直接降权。
怎么做:手动检查每篇长尾文章的链接密度,控制在每300字一个内链。我习惯用核子GEO做初步诊断,输入URL就能看到内链分布均匀度评分。