织梦如何区分移动端蜘蛛和访客
问题背景
织梦 DedeCMS 在做移动端适配时常遇到两难:真实移动访客要跳转到 /m/ 子站或响应式模板,但移动端蜘蛛(百度移动蜘蛛、Googlebot Smartphone、360 移动蜘蛛)却不能跳转,否则会让蜘蛛看不到 PC 版完整内容,影响双端收录。因此正确区分"移动蜘蛛"和"移动真实访客"是织梦适配方案的关键前置工作。
原因分析
UA 是唯一可靠依据
HTTP 请求中没有专门字段标记"我是蜘蛛",唯一识别方式是 User-Agent。蜘蛛 UA 通常包含 spider、bot 等关键字,且会带具体搜索引擎标识。
PC 蜘蛛与移动蜘蛛的差别
百度有独立的 Baiduspider(PC)与 Baiduspider-render、移动 UA 是 Baiduspider/2.0 (+http://www.baidu.com/search/spider.html) 同时伴 Mozilla/5.0...iPhone;Google 区分 Googlebot 与 Googlebot-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.php、list.php、view.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');
配置示例汇总
注意事项
- 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 识别的复杂度。