织梦如何区分移动端蜘蛛和访客

问题背景

织梦 DedeCMS 在做移动端适配时常遇到两难:真实移动访客要跳转到 /m/ 子站或响应式模板,但移动端蜘蛛(百度移动蜘蛛、Googlebot Smartphone、360 移动蜘蛛)却不能跳转,否则会让蜘蛛看不到 PC 版完整内容,影响双端收录。因此正确区分"移动蜘蛛"和"移动真实访客"是织梦适配方案的关键前置工作。

原因分析

UA 是唯一可靠依据

HTTP 请求中没有专门字段标记"我是蜘蛛",唯一识别方式是 User-Agent。蜘蛛 UA 通常包含 spiderbot 等关键字,且会带具体搜索引擎标识。

PC 蜘蛛与移动蜘蛛的差别

百度有独立的 Baiduspider(PC)与 Baiduspider-render、移动 UA 是 Baiduspider/2.0 (+http://www.baidu.com/search/spider.html) 同时伴 Mozilla/5.0...iPhone;Google 区分 GooglebotGooglebot-Mobile/Googlebot Smartphone

解决步骤

一、定义蜘蛛与移动 UA 正则

新建 /include/mobile_helper.php

<?php
function is_spider(){
    $ua=$_SERVER['HTTP_USER_AGENT'] ?? '';
    $spiders=array(
        'Baiduspider','Googlebot','bingbot','360Spider','Sogou web spider',
        'Sogou inst spider','Bytespider','YandexBot','Applebot','AhrefsBot'
    );
    foreach($spiders as $s){
        if(stripos($ua, $s) !==false) return true;
    }
    return false;
}

function is_mobile_ua(){
    $ua=$_SERVER['HTTP_USER_AGENT'] ?? '';
    return (bool)preg_match(
        '/(android|iphone|ipod|windows phone|blackberry|symbian|mobile)/i',
        $ua
    );
}

function is_mobile_spider(){
    $ua=$_SERVER['HTTP_USER_AGENT'] ?? '';
    // Google Smartphone
    if(stripos($ua,'Googlebot')!==false && stripos($ua,'Smartphone')!==false)
        return true;
    // Baidu 移动:UA 同时含 Baiduspider 与 ctfive/android/iphone
    if(stripos($ua,'Baiduspider')!==false &&
       preg_match('/(android|iphone|mobile)/i',$ua)) return true;
    // 360 移动
    if(stripos($ua,'360Spider')!==false && stripos($ua,'mobile')!==false)
        return true;
    return false;
}

二、跳转逻辑

在文章页 / 列表页入口 index.phplist.phpview.php 顶部调用:

require_once(DEDEINC.'/mobile_helper.php');
if(is_mobile_ua() && !is_spider()){
    // 真实移动访客 → 跳转到 m 子站
    $cur='https://m.example.com'.$_SERVER['REQUEST_URI'];
    header('Location: '.$cur, true, 302);
    exit;
}
// 蜘蛛或 PC 访客继续渲染 PC 模板

三、独立移动站的处理

如果做了独立的 m.example.com 子域,/m/ 模板里也应识别移动蜘蛛并返回移动版页面,PC 蜘蛛则 301 跳回 PC 主站。

四、配合 Vary 头

无论是否跳转,都应输出 Vary: User-Agent 响应头,告诉 CDN 与浏览器缓存这是按 UA 区分的版本:

header('Vary: User-Agent');

配置示例汇总

核心原则:蜘蛛不跳转,让它在原 URL 上看到完整 PC 内容;真实移动用户才跳到移动版。这样既保证双端收录,又保证用户体验。

注意事项

  • UA 容易被伪造,蜘蛛识别要再做反向 DNS 验证(验证 IP 反解析包含 baidu.com / googlebot.com)。
  • 百度移动蜘蛛 UA 中 Baiduspider 后面没有 "Mobile" 字样,但通常会带 ctfive 标识,需用正则匹配。
  • 跳转必须用 302 而不是 301,避免主域名权重被转移。
  • 使用 CDN 的站点要在 CDN 层做 UA 识别,否则跳转链路会被 CDN 缓存错乱。
  • 建议在百度站长平台"移动适配"提交 PC 与移动 URL 对应关系,加快适配生效。

实施建议

建议把 mobile_helper.php 抽成织梦核心钩子,所有页面入口统一引用。同时每周拉一次蜘蛛访问日志,统计 PC 蜘蛛与移动蜘蛛的抓取量,确认双端均被正常抓取。如果长期只有 PC 蜘蛛抓取,需要检查移动站是否在百度站长平台单独提交过、是否有 sitemap。从架构上看,长期更推荐改为响应式模板(同一 URL 服务双端),可以彻底免去 UA 识别的复杂度。