搜索全站
百度SEO 9 分钟阅读

用 robots 屏蔽低质量页面的正确方式:参数页、搜索页、分页与 noindex 配合

搜索页、参数页、分页要不要屏蔽?本文讲清 robots 与 noindex 的分工:哪些页面该封抓取、哪些该允许抓取但禁止索引,给出 Nginx 与 WordPress 两层实现代码,并说明错误组合的后果。

U
UFO_PF 2024-05-27 · 阅读 9 分钟
用 百度SEO
阅读提示
本文约 3,291 字,预计阅读 9 分钟。文中命令与配置均经过实测,可直接参考执行。

引言:屏蔽了反而收录更多

有位站长发现站里出现大量 ?utm_source=xxx、?s=关键词 这样的 URL 被收录,于是果断在 robots.txt 里加了一堆 Disallow。结果几周后这些 URL 不但没消失,反而从”有摘要的收录”变成了”无摘要的收录”——百度看不到页面内容,只能靠 URL 本身和外部线索把它留在索引里,连标题都是乱的。这就是把”禁止抓取”当成”禁止索引”用的典型后果。处理低质量页面,需要分清两个工具各自的职责。

原理分析:两个指令,两件事

指令 作用阶段 是否需要页面可被抓取 适用场景
robots.txt Disallow 禁止抓取 否 后台、接口、无限参数的组合页
meta robots noindex 禁止索引 是(必须能抓到) 搜索页、标签页、分页、重复内容
X-Robots-Tag(HTTP 头) 禁止索引 是 无法改 HTML 的页面,如 PDF、接口输出
canonical 合并重复 是 参数页指向规范版本

规则很简单:想让页面从索引里消失,就让它保持可抓取,然后加 noindex;只有当抓取本身会造成资源浪费或暴露后台时,才用 Disallow。

具体到各类页面:

  • 搜索结果页(/?s=):内容由用户输入决定,属于典型的低质、无限空间页面 → 用 robots 屏蔽,或保留可抓取但加 noindex。两者取其一即可,不要同时做。
  • 追踪参数页(?utm_source=):内容与主 URL 完全一致 → 用 canonical 指向干净 URL,通常不需要屏蔽。
  • 评论分页 /comment-page-2/:内容与主文重复 → noindex。
  • 归档分页 /page/2/:有少量独立价值,一般保留索引,无需处理;若列表页本身质量低可 noindex。
  • 附件页(attachment):内容极薄 → 用模板重定向到父文章,或 noindex。

保姆级实操

第一步:先盘点 URL 清单
从服务器日志与资源平台「索引量 → 页面抓取」里导出最近被抓的 URL,按路径归类,统计哪些目录占了多数抓取量。这一步不要跳过,凭感觉屏蔽往往会误伤。

第二步:在 Nginx 层给搜索页加 X-Robots-Tag
适合不方便改 PHP 的场景:

# 搜索结果页:允许抓取,但禁止索引
location = / {
    if ( $args ~* "^s=" ) {
        add_header X-Robots-Tag "noindex, nofollow" always;
    }
    try_files $uri $uri/ /index.php?$args;
}

# 评论分页与回复参数:一律 noindex
location ~* "replytocom=|comment-page-" {
    add_header X-Robots-Tag "noindex, nofollow" always;
}

# 后台与接口:直接禁止访问(不依赖 robots)
location ~* ^/(wp-login\.php|xmlrpc\.php)$ {
    # 按需限制来源 IP,切勿全局 403 掉搜索引擎
    try_files $uri $uri/ /index.php?$args;
}

改完用 curl -I 验证响应头确实带上了 X-Robots-Tag。

第三步:在 WordPress 层用 wp_robots 过滤器
WordPress 5.7 起提供 wp_robots 过滤器,比手写 meta 标签安全:

<?php
add_filter( 'wp_robots', function ( $robots ) {
    // 搜索结果页与 404:不索引、不跟踪
    if ( is_search() || is_404() ) {
        $robots['noindex']  = true;
        $robots['nofollow'] = true;
        return $robots;
    }
    // 标签归档、作者归档、附件页:不索引
    if ( is_tag() || is_author() || is_attachment() ) {
        $robots['noindex'] = true;
        return $robots;
    }
    // 评论分页:不索引,避免与主文重复
    if ( is_paged() && is_singular() ) {
        $robots['noindex'] = true;
    }
    return $robots;
} );

第四步:给追踪参数页加 canonical
不需要屏蔽,只需统一到规范地址:

add_action( 'wp_head', function () {
    if ( ! is_singular() ) {
        return;
    }
    $canonical = get_permalink();
    printf( "<link rel=\"canonical\" href=\"%s\" />\n", esc_url( $canonical ) );
}, 1 );

第五步:确认 robots 与 noindex 没有互斥
凡是加了 noindex 的页面,绝不能出现在 robots 的 Disallow 里,否则百度读不到 noindex,页面会长期留在索引中。

第六步:提交死链与观察(观察期内如果索引量同步下滑,按百度索引量突然下降的排查流程定位)
已经被收录的低质 URL,可在资源平台「死链提交」按格式提交,加快清理;同时观察 2–4 周。

常见踩坑

  1. 同时 Disallow 和 noindex:互相抵消,页面既不会被抓也不会被移除,是最常见的组合错误。
  2. 屏蔽了 CSS/JS 目录:前文提到过,会让页面渲染判断失真。
  3. 用 Disallow: /*?* 一刀切:这会屏蔽所有带参数的 URL,包括正常的翻页与筛选,误伤极大。
  4. Nginx if 里 add_header 失效:在 if 块中使用 add_header 需要注意继承问题,务必加 always 并用 curl 验证。
  5. 案例:某论坛为清理 ?tid=123&action=print 这类打印页,在 robots 里加了 Disallow: /*action=print,同时在模板里加了 noindex。三个月后这些 URL 依然在索引里。去掉 robots 规则、只保留 noindex 一个月后,索引量才真正下降。
  6. noindex 加在缓存层:页面缓存插件缓存了旧响应头,新规则没生效,需清缓存后验证。
  7. 把分页全部 noindex 导致深链无法发现:列表分页是百度发现老文章的重要入口,全部屏蔽会降低整站收录深度。

总结

判断标准:页面”值不值得抓取”和”值不值得索引”是两个独立问题。后台、接口、无限组合参数 → Disallow;搜索页、标签页、附件页、重复分页 → 可抓取 + noindex;参数变体 → canonical。行动清单:导出 URL 清单分类 → Nginx 或 wp_robots 实现 → curl 验证响应头与 meta → 确认无 Disallow/noindex 冲突 → 死链提交已收录的低质 URL → 观察 2–4 周。robots 的基础写法见百度robots.txt写法与常见错误。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。