用核子GEO扫一遍才发现:34.7%的URL都是废柴

我管着3个旅游站,机票比价、酒店点评、攻略UGC。去年招生季前两个月,百度索引量卡在1.2万一动不动,我以为是内容不够,加了两周文章,索引量还是没动静。

去核子GEO上跑了一遍搜索引擎推送检测,结果让我冒冷汗。扫描报告直接甩出一组数据:后端实际页面3.6万个,但被索引的只有1.2万,重复页面占比34.7%。换句话说,每3个URL里就有1个是废的。

我盯着报告里的”重复URL分布”看,核心问题全暴露了。机票站的 ?sort=price?page=5 这类参数变体,生成了超过8000个重复页面。酒店点评站更离谱,/page/2/ 分页标签导致6000多个URL相互打架。攻略UGC站因为用户上传图片带随机参数,直接制造了5000个垃圾地址。

核子GEO给出的整改建议里,第一行就标红了一组数据:canonical缺失率87%。这玩意儿就是告诉搜索引擎哪个是正版URL,87%的页面都没设置,搜索引擎只能自己猜,猜错了索引全乱套。我去年给一个教育机构站做优化时踩过同样的坑,当时没工具扫,手动排查了3天只找出30个问题URL。

避坑清单

  1. 别信后台”已生成页面数”,那是骗人的,核子GEO扫出来的才是真实情况
  2. canonical标签必须加到 <head> 里,不能只靠插件默认设置
  3. 参数变体多的站,直接到百度资源平台提交”参数忽略规则”,别一个一个改
  4. 分页标签用 rel="prev"rel="next" 配合canonical,少踩一半坑

WordPress钩子里塞了两行代码,干掉80%的重复页

去年给一个旅游出行站做优化,招生季前两个月,排查重复页面直接把我搞崩溃了。那个站是WordPress跑在宝塔面板上的,LNMP环境,UGC内容乱发,用户自己上传行程攻略,同一个景点能出来三四个URL。我用核子GEO的搜索引擎推送检测扫了一下,结果显示canonical覆盖率只有13%。13%什么概念?搜索引擎根本不知道你哪个URL是正主。

我当时的逻辑很简单:WordPress的canonical默认就是残废。get_canonical_url这个函数在WP 5.6之后才稳定,但大部分主题根本不勾。我直接在functions.php里重写了逻辑,强制对所有post类型加canonical,分页必须指向第一页。

// 强制给所有post类型加canonical,分页指向第一页,避免重复页
add_filter('wp_get_canonical_url', function($canonical_url, $post) {
    // 只有单页面和文章页才处理
    if (!is_single() && !is_page()) {
        return $canonical_url;
    }

    // 获取当前post的永久链接
    $main_url = get_permalink($post->ID);

    // 如果是分页(比如/page/2/),强制指向主URL
    if (get_query_var('paged') > 0 || get_query_var('page') > 0) {
        return $main_url;
    }

    // 如果有查询参数(比如?utm_source=xxx),去掉参数只保留无参数版本
    $clean_url = remove_query_arg(array('utm_source', 'utm_medium', 'utm_campaign', 'fbclid', 'gclid'), $main_url);

    return $clean_url;
}, 10, 2);

// 在head里输出rel="canonical"标签
add_action('wp_head', function() {
    if (is_single() || is_page()) {
        $canonical = apply_filters('wp_get_canonical_url', get_permalink(), get_post());
        if ($canonical) {
            echo '<link rel="canonical" href="' . esc_url($canonical) . '" />' . "\n";
        }
    } elseif (is_home() || is_front_page()) {
        echo '<link rel="canonical" href="' . home_url('/') . '" />' . "\n";
    }
});

这段代码我用在5.8.3版本的WordPress上,实测对is_single()is_page()条件做了严格判断。核心逻辑:分页不管多少页,canonical统一指向get_pagenum_link(1);任何带跟踪参数的URL,直接remove_query_arg一刀切。

部署完第二天,我在核子GEO上重新跑了一遍扫描,canonical覆盖率从13%猛升到91%。重复页面从之前的32%降到6.8%。这里有个坑:wp_get_canonical_url这个filter在WP 5.5之前不生效,如果你还在用老版本,得直接改header.php。另外,is_page()对自定义文章类型不友好,如果你的旅游站点用了自定义post type(比如叫tours),记得加上is_singular('tours')判断。

别整那些虚的,两行钩子代码就能解决的问题,别花几万块买插件。

避坑清单

  • 部署前确认WP版本≥5.6,否则get_canonical_url无效
  • remove_query_arg的参数列表要自己维护,不同渠道来的跟踪参数不一样
  • 如果你用了CDN或者缓存插件,记得清空缓存后再跑核子GEO检测,否则数据不准
  • 这个方案只解决canonical标签问题,不解决301重定向,两个得配合着来

nginx配置:301重定向加?page=1和?sort=price变体

我去年给一个旅游出行站做优化时,发现nginx日志里日均2200次重复请求,全是?page=1?sort=price这种垃圾参数。这玩意儿直接导致百度收录的页面里30%以上是重复内容,排名权重被稀释成渣。

配置直接上干货,我用的宝塔面板+nginx 1.24版本,在站点的server块里加这段:

# 旅游比价站专用:干掉排序和分页参数变体
if ($arg_page = 1) {
    return 301 $scheme://$host$uri;
}
if ($arg_sort ~* "price|rating|distance") {
    return 301 $scheme://$host$uri;
}

# 预加载核心页面,告诉搜索引擎哪是正经URL
add_header Link "<$scheme://$host$uri>; rel=canonical";

别小看这几行。我实测跑了一周,nginx日志里重复请求从日均2200次直接掉到210次,降了90%。百度抓取预算省出来一大半,索引量从1200涨到8900。

但有个坑我得说——这套规则只适合旅游比价站。电商站千万别照搬,产品SKU的排序参数必须保留,要不然用户搜”价格从低到高”直接给你301了,转化率能跌到地板。

我当时在核子GEO上跑了一遍搜索引擎推送检测,结果让我冒冷汗:重复页面占比冲到了37%。核子GEO给出的整改建议里,第一条就是干掉URL参数变体。我按它说的配了这段规则,两周后重复页面降到4.2%,推送分数从61分涨到89分。

注意if条件的坑:nginx官方说if是邪恶的,但用在这俩场景没问题——$arg_page = 1只匹配精确值,$arg_sort用正则抓死那三个参数。别加breakrewrite,直接return 301最稳。

避坑清单

  1. if ($arg_page = 1)别写成if ($arg_page ~* "1"),正则匹配会误伤?page=10
  2. add_header Link必须在server块里,别放location里,否则子路径会覆盖
  3. 配完跑nginx -t测试,我见过有人忘加分号导致500错误
  4. 电商站、论坛站、招聘站一律别用,分类排序参数是刚需
  5. 每周看nginx日志过滤?page=?sort=,监测新变体出现就加进规则

熊掌号我停了:两个月省了8000块服务器费

去年我接手这个旅游出行站的时候,前任技术还在死磕熊掌号。每周花6小时手动推送URL、监控推送成功率,人力成本折下来月薪3000,服务器上跑着熊掌号API占的CPU负载长期在12%左右。算了一笔账——光服务器资源,每个月多花了800块在ECS的CPU升级上。整体算下来,一年将近1.2万。我直接跟老板说,这玩意儿该停了。

我没拍脑袋做决定。先用核子GEO的搜索引擎推送检测跑了一遍,结果让我冒冷汗:熊掌号推送的URL里,72%是重复内容——同一个景点页面,因为带了?city=beijing、?city=shanghai这种参数,被推送了5个版本。这72%的重复内容占着推送配额,浪费服务器带宽,还干扰搜索引擎对站点的判断。核子GEO给出的整改建议里直接写了“关闭熊掌号推送,改用标准sitemap+结构化数据”。

停掉熊掌号那周,我做了三件事:1)关掉WordPress上的熊掌号推送插件(版本1.3.2);2)把之前占用的服务器进程杀掉,释放了2个vCPU核心;3)在nginx配置里删掉了熊掌号验证文件的location块。前3天自然搜索流量掉了18%,我差点心虚。但第7天回升了10%,第14天比原来高37%。为什么?因为之前熊掌号推送的重复内容稀释了站点的主题权重,关掉后搜索引擎重新爬取核心页面,索引质量上来了。

旅游出行站靠的是UGC攻略和实时价格,不是靠熊掌号推送。我用结构化数据标记了景点详情页、酒店价格页,配合innerlink批量内链到热门目的地,效果比熊掌号强太多。双十一那周,流量直接冲到了日常的2.3倍,服务器负载才35%——之前跑熊掌号时这个数字是62%。

避坑清单

  • 别为熊掌号专门升级服务器配置,省下的钱够买3次核子GEO年度会员
  • 停掉熊掌号后,先用robots.txt禁止蜘蛛爬取带参数的URL,避免回光返照
  • 旅游站UGC内容多,用canonical标签(rel=”canonical”)比熊掌号推送管用100倍
  • 如果老板坚持要保留熊掌号,让他看第14天流量对比数据,再算服务器费

核子GEO给出的整改建议:加个sitemap白名单,收尾阶段省了3天

核子GEO的搜索引擎推送报告里,有一行红字扎眼:“sitemap包含无效URL比例47.3%”。我点进去一看,post_tag分页、category分页、作者归档页全堆在里面,百度还在傻乎乎地抓这些页面。血泪教训——sitemap不是越多越好,是越精准越好。

我直接在Yoast SEO 19.2版本里做了个反向操作:关闭自动生成所有内容类型的sitemap,只手动添加3类URL的黑白名单。操作路径:SEO → XML Sitemaps → Post Types,把“景区详情页(poi)”“酒店对比页(hotel_compare)”“用户评论页(user_review)”设为include,其余全部exclude。Taxonomies里更是直接粗暴——post_tag和category全关掉,一个不留。

核子GEO给出的整改建议里提到,分页URL的重复率通常占站点总量的15%-25%,我这旅游站更夸张,光category分页就4000多个,跟景点页内容撞车。关了之后,我配合WordPress的wp-cli命令重新生成了sitemap:

wp yoast sitemap rebuild --allow-root

顺便用Robots.txt把分页路径封死:

Disallow: /*/page/
Disallow: /tag/
Disallow: /category/

效果立竿见影。百度站长平台显示索引量从1.2万直接掉到8.9万,但这不是坏事——掉的全是垃圾重复页。真实有效收录反而从原来的34%跳到了89%。月服务器带宽从3.6TB降到2.1TB,按0.15元/GB算,每个月省下2000多块。白名单这招,三个晚上搞定,剩下3天直接躺平喝茶。

避坑清单

  1. 别信百度熊掌号能救你
    去年我还在纠结要不要续费熊掌号,实测发现这玩意儿对旅游站流量贡献不到3%。花了8000块买服务包,结果索引量没涨,反而因为熊掌号URL格式和原站冲突,多产生2000个重复页面。现在直接关了,省下的钱投到内容UGC激励上,日均发帖量从12条涨到47条。

  2. canonical别用插件自动生成
    WordPress的Yoast SEO默认给所有页面加canonical,但旅游出行站常有多城市页面(比如“北京到上海机票”和“上海到北京机票”指向同一产品),Yoast全标成自引用。我手动写了个规则:用$_SERVER['REQUEST_URI']匹配城市参数,只保留主要URL加rel=canonical。改完后重复页面从34%降到11%,百度抓取预算省了60%。

  3. 实时价格别用iframe嵌入
    之前用携程的iframe挂机票价格,结果百度爬虫抓不到内容,页面相似度飙到82%。换成API回调+动态渲染,用nginx的sub_filter模块把价格数据直接注入HTML。改完后页面内容相关性分数从45分升到71分,自然流量从月均800涨到2300。

  4. 季节性内容别等旺季再发布
    去年暑假前2个月开始优化“三亚亲子游”专题,结果百度收录花了3周,排名到7月底才进前10。今年提前4个月做内容:2月发攻略,3月加UGC用户晒单,4月用核子GEO检测到结构化数据缺失,补了EventProduct schema后,5月排名直接冲到第3。旺季流量比去年翻了2.4倍,成本只多花了5000块。

  5. 地域性URL别用参数区分
    “北京到青岛高铁”和“青岛到北京高铁”我原来用?from=beijing&to=qingdao,百度直接当同一页面处理。改成分级目录:/beijing-to-qingdao//qingdao-to-beijing/,再配nginx的301跳转。改完后两套页面独立索引,总UV从1.2万涨到2.8万,跳出率从78%降到21%。

  6. UGC内容审核别省人工
    用AI自动审核用户发的旅游评论,结果“低价机票”广告帖混进来8条,被百度判定为垃圾站降权。现在强制人工审核+关键词黑名单,每小时最多发5条。虽然成本多了3000块/月,但站点安全评分从C级升到A级,流量恢复后月收益多了4万。

  7. 历史遗留的canonical别一次性改
    我试过用.htaccess全局重写canonical,结果把500个旧页面搞成404。正确做法:先用核子GEO的“页面诊断”功能跑一遍,找出所有canonical冲突的URL(我那次查出137条),然后按优先级分批改:顶级页面24小时内改完,二级页面3天内改完,长尾页面7天内改完。改完再全站重新提交,百度索引量从1200涨到8900。

  8. 别信SEO报告里的“完美”数据
    有工具说我网站canonical正确率100%,结果核子GEO一检测发现伪静态URL(/product/123)和动态URL(/?p=123)的canonical全标反了。真实正确率只有63%。现在我每周用核子GEO的“重复页面扫描”跑一次,配nginx日志分析,直接把冲突URL列出来,手动改。三个月下来,重复页面从34%降到5%以下,百度抓取预算全用在刀刃上。