5种PHP代码识别搜索引擎蜘蛛实战指南:含反转换法

5种PHP代码识别搜索引擎蜘蛛实战指南:含反转换法

判断搜索引擎蜘蛛在内容更新、网站重构、A/B测试、反爬限流等合规场景中很常用。本文系统拆解301、302、Meta Refresh、HTTP状态码、JS跳转5种原理,给出Discuz黑白名单、分类日志统计、UA全集匹配、判断后跳转、JS referrer分流5种PHP代码实战,并补充2026年AI爬虫识别清单、双向DNS校验进阶方案与cloaking合规红线。

张文保 更新 28 分钟阅读 5,669 阅读
本文目录
  1. 什么场景下需要判断搜索引擎蜘蛛跳转
  2. 判断搜索引擎蜘蛛跳转的5种常用原理
  3. 方法一:通过PHP判断是搜索引擎蜘蛛还是实际用户(Discuz风格)
  4. 方法二:使用PHP实现蜘蛛访问日志统计
  5. 方法三:HTTP_USER_AGENT 蜘蛛全集匹配
  6. 方法四:判断后做实际跳转(header Location)
  7. 方法五:JavaScript referrer判断(基于来源域名)
  8. 进阶:反向DNS校验防伪装爬虫
  9. 5种方法的适用场景对比
  10. 实战避坑:3个最常见的踩坑
  11. 踩坑一:UA判断的大小写陷阱
  12. 踩坑二:301跳转后无法回滚
  13. 踩坑三:误判蜘蛛导致cloaking风险
  14. 常见问题解答
  15. 仅给搜索引擎展示和用户不同的内容会被Google惩罚吗?
  16. 用UA判断的准确率为什么不能做到100%?
  17. 301和302对SEO的影响有什么实际差别?
  18. JavaScript跳转Google能识别吗?
  19. Meta Refresh跳转还能用吗?
  20. 需要专门处理AI爬虫(GPTBot、ClaudeBot等)吗?
  21. 反向DNS校验性能开销大,怎么优化?
  22. 判断蜘蛛跳转的代码应该放在网站的哪一层?
  23. 结语:合规第一,准确率第二

什么场景下需要判断搜索引擎蜘蛛跳转

保哥这些年帮客户处理网站迁移、改版、A/B测试时,遇到过太多需要"对蜘蛛和真人区别对待"的场景。先把5个最常见的应用场景梳理清楚:

  1. 内容更新或重定向:当网站的某些页面内容发生变化,或当某个页面的URL更改时,可以使用跳转将搜索引擎蜘蛛引导到新页面,以确保它们能够抓取到最新的内容
  2. 网站重构:在网站结构重构的情况下,可能需要将旧页面跳转到新页面,以维护流量和SEO排名
  3. 删除页面:当页面被删除时,使用301重定向可以将流量引导到相关的替代页面,避免404错误页面
  4. 移动设备优化:在实施响应式设计或为移动设备创建专门页面时,可以设置跳转,以便搜索引擎蜘蛛能够访问适合其设备的版本
  5. A/B测试:在进行A/B测试时,可能需要引导搜索引擎蜘蛛访问特定版本的页面,以收集数据或优化排名

这里有一个保哥必须提前警告的合规红线:仅向搜索引擎蜘蛛展示与用户不同的内容(cloaking隐藏页)是Google明令禁止的黑帽SEO手法,一旦被检测会触发严重惩罚甚至K站。本文讲的"判断蜘蛛跳转"是用于合规场景(缓存策略区分、日志统计、维护期友好提示等),不是用来欺骗搜索引擎。下面的代码也请基于合规场景使用。

判断搜索引擎蜘蛛跳转的5种常用原理

  1. 301重定向:这是最常用的永久重定向方式,搜索引擎蜘蛛会将权重传递到新的页面,同时用户和搜索引擎都会被引导到指定的新URL
  2. 302重定向:这是临时重定向,适用于短期调整,搜索引擎通常会保留旧URL的权重
  3. Meta Refresh标签:虽然不推荐使用,但可以通过设置Meta Refresh标签在HTML中实现跳转。这通常会在几秒后自动将用户或蜘蛛引导到新页面
  4. HTTP头部状态码:通过设置适当的HTTP响应状态码(如404、410等),可以告知搜索引擎该页面的状态,以便进行相应的处理
  5. JavaScript重定向:使用JavaScript进行页面重定向,虽然搜索引擎可以处理这些重定向,但不如301或302重定向直接和有效

在设置跳转时,选择合适的方法和状态码非常重要,以确保搜索引擎能够正确抓取并理解页面之间的关系。301是首选,302只在确实是临时跳转时使用,Meta Refresh和JS跳转尽量避免——Google官方文档明确建议优先使用HTTP层的301。

方法一:通过PHP判断是搜索引擎蜘蛛还是实际用户(Discuz风格)

以下代码摘自Discuz论坛源码,是经典的User-Agent黑白名单判断模式。优点是同时检查蜘蛛关键词和浏览器关键词,能识别一些伪装成浏览器的爬虫。

<?php
function checkrobot($useragent='') {
    static $kw_spiders = array('bot', 'crawl', 'spider', 'slurp', 'sohu-search', 'lycos', 'robozilla');
    static $kw_browsers = array('msie', 'netscape', 'opera', 'konqueror', 'mozilla');

    $useragent = strtolower(empty($useragent) ? $_SERVER['HTTP_USER_AGENT'] : $useragent);
    if (strpos($useragent, 'http://') === false && dstrpos($useragent, $kw_browsers)) return false;
    if (dstrpos($useragent, $kw_spiders)) return true;
    return false;
}

function dstrpos($string, $arr, $returnvalue = false) {
    if (empty($string)) return false;
    foreach ((array)$arr as $v) {
        if (strpos($string, $v) !== false) {
            $return = $returnvalue ? $v : true;
            return $return;
        }
    }
    return false;
}

if (checkrobot()) {
    echo '机器人爬虫';
} else {
    echo '人';
}
?>

实际应用中可以这样判断"不是搜索引擎才执行操作"(比如刷新计数器、记录UV、推送广告):

<?php
if (!checkrobot()) {
    // do something(比如增加访问计数、推送Adsense广告等)
}
?>

这个模式的局限:判断逻辑较宽泛,只要User-Agent里出现"bot""crawl""spider"等关键词就识别为蜘蛛——但现代爬虫越来越多伪装成普通浏览器UA,所以这种纯黑白名单的准确率会下降到80%左右。如果对准确率要求高,建议配合反向DNS校验(参见方法5之后的进阶部分)。

方法二:使用PHP实现蜘蛛访问日志统计

这种方式针对每个主流搜索引擎单独识别,可以同时做"判断"和"分类记录"两件事,是大多数中小站的日志统计标配。

<?php
$useragent = addslashes(strtolower($_SERVER['HTTP_USER_AGENT']));
if (strpos($useragent, 'googlebot') !== false) { $bot = 'Google'; }
elseif (strpos($useragent, 'mediapartners-google') !== false) { $bot = 'Google Adsense'; }
elseif (strpos($useragent, 'baiduspider') !== false) { $bot = 'Baidu'; }
elseif (strpos($useragent, 'sogou spider') !== false) { $bot = 'Sogou'; }
elseif (strpos($useragent, 'sogou web') !== false) { $bot = 'Sogou web'; }
elseif (strpos($useragent, 'sosospider') !== false) { $bot = 'SOSO'; }
elseif (strpos($useragent, '360spider') !== false) { $bot = '360Spider'; }
elseif (strpos($useragent, 'yahoo') !== false) { $bot = 'Yahoo'; }
elseif (strpos($useragent, 'msn') !== false) { $bot = 'MSN'; }
elseif (strpos($useragent, 'msnbot') !== false) { $bot = 'msnbot'; }
elseif (strpos($useragent, 'sohu') !== false) { $bot = 'Sohu'; }
elseif (strpos($useragent, 'yodaobot') !== false) { $bot = 'Yodao'; }
elseif (strpos($useragent, 'ia_archiver') !== false) { $bot = 'Alexa'; }
elseif (strpos($useragent, 'slurp') !== false) { $bot = '雅虎'; }
elseif (strpos($useragent, 'bot') !== false) { $bot = '其它蜘蛛'; }

if (isset($bot)) {
    $fp = @fopen('bot.txt', 'a');
    fwrite($fp, date('Y-m-d H:i:s') . "\t" . $_SERVER["REMOTE_ADDR"] . "\t" . $bot . "\t" . 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER["REQUEST_URI"] . "\r\n");
    fclose($fp);
}
?>

保哥的使用经验:直接写文本文件的方式适合单机小站,每天蜘蛛访问1万次以下没问题。如果是日访问量大的站点,应该写入MySQL(带索引的爬虫日志表),或者写入Redis的List后再异步落盘。直接频繁写文本会因为文件锁导致请求堆积,影响真实用户访问速度。

方法三:HTTP_USER_AGENT 蜘蛛全集匹配

方法三比方法二覆盖更全面,把已知的几十种爬虫UA全部纳入识别。适合需要做精细化蜘蛛识别的场景(比如反爬、CDN路由、动态资源限流)。

<?php
function isCrawler() {
    $agent = strtolower($_SERVER['HTTP_USER_AGENT']);
    if (!empty($agent)) {
        $spiderSite = array(
            "TencentTraveler", "Baiduspider+", "BaiduGame", "Googlebot",
            "msnbot", "Sosospider+", "Sogou web spider", "ia_archiver",
            "Yahoo! Slurp", "YoudaoBot", "Yahoo Slurp", "MSNBot",
            "Java (Often spam bot)", "BaiDuSpider", "Voila", "Yandex bot",
            "BSpider", "twiceler", "Sogou Spider", "Speedy Spider",
            "Google AdSense", "Heritrix", "Python-urllib",
            "Alexa (IA Archiver)", "Ask", "Exabot", "Custo",
            "OutfoxBot/YodaoBot", "yacy", "SurveyBot", "legs",
            "lwp-trivial", "Nutch", "StackRambler",
            "The web archive (IA Archiver)", "Perl tool", "MJ12bot",
            "Netcraft", "MSIECrawler", "WGet tools", "larbin", "Fish search"
        );
        foreach ($spiderSite as $val) {
            $str = strtolower($val);
            if (strpos($agent, $str) !== false) {
                return true;
            }
        }
        return false;
    } else {
        return false;
    }
}

if (isCrawler()) {
    echo "你好蜘蛛精!";
} else {
    echo "你不是蜘蛛精啊!";
}
?>

2026年保哥建议你额外加入的UA:GPTBot(OpenAI爬虫)、anthropic-ai(Claude爬虫)、PerplexityBot、ClaudeBot、Google-Extended(Google AI训练专用UA)、YouBot、Bytespider(字节跳动豆包爬虫)、CCBot(Common Crawl)。AI爬虫从2023年开始爆发,是传统蜘蛛清单里没有的新类别,但流量占比已经能到5%到10%。

方法四:判断后做实际跳转(header Location)

方法四是把判断逻辑和跳转动作绑在一起。常用于"不是蜘蛛就跳到主站某个着陆页"的合规场景(如域名重定向、A/B测试分流)。

<?php
$flag = false;
$tmp = $_SERVER['HTTP_USER_AGENT'];

if (strpos($tmp, 'Googlebot') !== false) { $flag = true; }
else if (strpos($tmp, 'Baiduspider') !== false) { $flag = true; }
else if (strpos($tmp, 'Yahoo! Slurp') !== false) { $flag = true; }
else if (strpos($tmp, 'msnbot') !== false) { $flag = true; }
else if (strpos($tmp, 'Sosospider') !== false) { $flag = true; }
else if (strpos($tmp, 'YodaoBot') !== false || strpos($tmp, 'OutfoxBot') !== false) { $flag = true; }
else if (strpos($tmp, 'Sogou web spider') !== false || strpos($tmp, 'Sogou Orion spider') !== false) { $flag = true; }
else if (strpos($tmp, 'fast-webcrawler') !== false) { $flag = true; }
else if (strpos($tmp, 'Gaisbot') !== false) { $flag = true; }
else if (strpos($tmp, 'ia_archiver') !== false) { $flag = true; }
else if (strpos($tmp, 'altavista') !== false) { $flag = true; }
else if (strpos($tmp, 'lycos_spider') !== false) { $flag = true; }
else if (strpos($tmp, 'Inktomi slurp') !== false) { $flag = true; }

if ($flag == false) {
    header("Location: //zhangwenbao.com" . $_SERVER['REQUEST_URI']);
    // 自动转到 zhangwenbao.com 对应的网页
    // $_SERVER['REQUEST_URI'] 为域名后面的路径
    // 或换成 header("Location: //zhangwenbao.com/seo/google-seo");
    exit();
}
?>

重要警告:以上代码默认302临时跳转。如果是永久跳转,必须在header之前显式输出"HTTP/1.1 301 Moved Permanently",否则Google会按302处理,权重不会完整传递。永久跳转的正确写法:

header("HTTP/1.1 301 Moved Permanently");
header("Location: https://newdomain.com" . $_SERVER['REQUEST_URI']);
exit();

方法五:JavaScript referrer判断(基于来源域名)

方法五不依赖User-Agent,而是判断访问来源是不是从主流搜索引擎页面跳转过来。逻辑跑在浏览器端,所以蜘蛛本身不会触发——它适用于"识别真实用户的搜索来源",而不是"识别蜘蛛"。

<script type="text/javascript">
if (window.name != 'ad_app6') {
    var r = document.referrer;
    r = r.toLowerCase();
    var aSites = new Array('google.', 'baidu.', 'soso.', 'so.', '360.', 'yahoo.', 'youdao.', 'sogou.', 'gougou.');
    var b = false;
    for (i in aSites) {
        if (r.indexOf(aSites[i]) > 0) {
            b = true;
            break;
        }
    }
    if (b) {
        self.location = '要跳转的网址';
        window.adworkergo = 'ad_app6';
    }
}
</script>

这种方式适合"从搜索引擎来的用户跳到落地页A,其他用户跳到落地页B"的营销分流场景。注意Google官方明确表态:仅向搜索引擎蜘蛛展示和真实用户不同的内容是cloaking,会被惩罚;但是基于referrer做用户分流是允许的——蜘蛛抓取看到的是原页面,用户从搜索结果点过来后才跳转,两套体验不冲突。

进阶:反向DNS校验防伪装爬虫

纯UA匹配的最大问题是UA可以伪造。例如有些恶意爬虫会把UA改成Googlebot来骗过你的判断逻辑。Google官方推荐的"严格判断真Googlebot"方法是双向DNS验证:

<?php
function isRealGooglebot($ip) {
    // 第一步:反向DNS查询拿到主机名
    $host = gethostbyaddr($ip);
    if (!$host) return false;

    // 第二步:检查主机名是否在 .googlebot.com 或 .google.com 域内
    if (!preg_match('/\.googlebot\.com$|\.google\.com$/i', $host)) {
        return false;
    }

    // 第三步:正向DNS查询,确认主机名解析回来的IP和原IP一致
    $forwardIp = gethostbyname($host);
    return $forwardIp === $ip;
}

$ip = $_SERVER['REMOTE_ADDR'];
$ua = $_SERVER['HTTP_USER_AGENT'];

if (strpos($ua, 'Googlebot') !== false && isRealGooglebot($ip)) {
    // 真Googlebot,做你想做的
}
?>

同样的双向DNS校验也适用于Bingbot(.search.msn.com)、Baiduspider(.crawl.baidu.com,但百度的反向DNS不是100%可靠)。这种方法准确率99%以上,但每次DNS查询有性能损耗(每个请求10到50毫秒),建议把判断结果缓存到Redis里,单个IP缓存24小时。

5种方法的适用场景对比

方法实现难度准确率性能典型场景
方法一 Discuz黑白名单80%简单识别、流量统计
方法二 分类日志85%蜘蛛访问日志统计
方法三 全集匹配90%反爬、CDN路由
方法四 判断后跳转85%域名重定向、合规跳转
方法五 JS referrer分流不适用用户来源分流(不识别蜘蛛)
进阶 双向DNS校验99%低(需缓存)严格防伪装爬虫

实战避坑:3个最常见的踩坑

踩坑一:UA判断的大小写陷阱

很多代码用strpos去匹配UA,但忘记把UA转小写。Googlebot的UA可能是"Googlebot"也可能是"GoogleBot"或"GOOGLEBOT"(不同请求大小写不同),如果你不先strtolower再匹配,会漏掉一半。修复非常简单:所有判断前先一行$ua = strtolower($_SERVER['HTTP_USER_AGENT'])。

踩坑二:301跳转后无法回滚

301是"永久重定向",浏览器和搜索引擎会缓存这个跳转关系长达数月到数年。如果你不小心写错301目标URL,再改回去时浏览器还是会跳到错误URL。修复方法:先用302调试,确认逻辑无误后再改成301;如果已经误用301,需要在新URL上再做一次301跳回原URL,并通过Google Search Console的URL Inspection重新提交索引。

踩坑三:误判蜘蛛导致cloaking风险

如果你的UA判断逻辑不严谨(比如简单匹配"bot"),可能把一些正常浏览器(如某些手机浏览器UA里也有bot字样)误判为蜘蛛,从而展示了不同的内容。这在Google的算法里会被识别为cloaking信号。修复方法:UA匹配尽量用具体的spider名(Googlebot、Baiduspider)而不是泛词;同时配合双向DNS校验做二次确认。

常见问题解答

仅给搜索引擎展示和用户不同的内容会被Google惩罚吗?

会,这是经典的cloaking黑帽SEO手法。Google的Spam Policies里明确写到cloaking是违规行为,触发后会被人工或自动算法降权,严重的会被K站。本文讲的5种方法主要用于合规场景:流量统计、CDN路由优化、反爬限流、维护期友好提示等。所有"判断蜘蛛然后展示不同内容"的操作都必须经过法律和SEO顾问审查,确认不构成欺骗。

用UA判断的准确率为什么不能做到100%?

因为UA字段是HTTP头里可以任意修改的字段。恶意爬虫可以把自己的UA改成Googlebot来伪装合法。同时,部分浏览器扩展(如User-Agent Switcher)也能修改UA。要做到接近100%的准确率,必须配合双向DNS校验(验证UA声称的爬虫域名是否真的指向请求IP)或者IP白名单(如Google官方公布的Googlebot IP范围)。

301和302对SEO的影响有什么实际差别?

301(永久重定向)会把旧URL的权重几乎完整地传递到新URL,搜索引擎会逐步把索引切换到新URL;302(临时重定向)保留旧URL在索引中的位置,权重不传递。SEO场景下永久迁移必须用301,调试或A/B测试用302。Google在2016年之后官方表态301和302的权重传递差距已经很小,但行业普遍依然遵循"永久迁移必301"的最佳实践。

JavaScript跳转Google能识别吗?

能,但识别延迟和稳定性都不如HTTP层跳转。Google的爬虫会渲染JavaScript,对于纯JS跳转会跟踪到目标URL并更新索引——但这个过程比301慢得多(HTTP层301是秒级,JS跳转可能要数小时到数天)。对SEO敏感的场景,永远优先用HTTP层301,JS跳转只用于无SEO影响的用户层分流。

Meta Refresh跳转还能用吗?

能用但不推荐。Google官方建议不要用Meta Refresh做永久跳转——0秒立即跳的Meta Refresh会被部分视作301,但带延迟的(如3秒后跳)会被视作软404或低质量内容。最佳实践:永远在服务器端用HTTP 301解决永久跳转问题,Meta Refresh只在没有服务器端控制能力(如纯静态托管)的极端情况下使用。

需要专门处理AI爬虫(GPTBot、ClaudeBot等)吗?

2026年的现状是必须处理。AI爬虫的访问频率从2023年开始快速上升,部分内容站AI爬虫流量已经占总爬虫流量的15%到25%。建议在你的UA清单里把GPTBot、anthropic-ai、PerplexityBot、ClaudeBot、Google-Extended、Bytespider加进去,并在robots.txt里明确决策是允许还是拒绝AI训练用爬虫。商业内容站建议拒绝AI训练爬虫但允许AI实时检索爬虫(如PerplexityBot),平衡内容保护和AI搜索可见性。

反向DNS校验性能开销大,怎么优化?

核心优化思路是缓存。第一次校验完成后把"IP加是否真Googlebot"的判断结果缓存到Redis或Memcached,缓存时间设为24小时(与Googlebot IP段的变更频率相当)。下次同一IP请求时直接读缓存,跳过DNS查询。优化后单次判断的平均耗时可以从30到50毫秒降到1毫秒以内,性能损耗可以忽略。

判断蜘蛛跳转的代码应该放在网站的哪一层?

取决于你的架构。Apache或Nginx层用rewrite规则做判断性能最高(无PHP开销,C原生执行);如果是用PHP框架(Laravel、ThinkPHP),写一个中间件(Middleware)在所有路由前处理;如果是WordPress或Typecho,写一个Must-Use插件挂到template_redirect钩子上。性能从高到低:Web服务器层大于框架中间件大于CMS插件钩子。日均PV在10万以上的站点建议放在Web服务器层。

结语:合规第一,准确率第二

判断搜索引擎蜘蛛跳转是个老技术话题,但2026年有两个新维度值得重新审视:一是AI爬虫的出现让传统的"搜索引擎蜘蛛"清单不再完整,必须把GPTBot、ClaudeBot等纳入识别;二是Google对cloaking的检测越来越严格,任何"仅向蜘蛛展示不同内容"的逻辑都必须有清晰的合规说明,不再像10年前那样可以随意操作。

本文5种方法加进阶DNS校验已经覆盖了绝大多数合规场景的需求。选择哪一种取决于你的具体场景:流量统计用方法一或方法二,反爬限流用方法三,永久迁移用方法四加301,用户来源分流用方法五,严格防伪装用进阶DNS校验。把代码作为起点,再根据自己网站的UA分布和性能要求做微调,是最稳妥的落地路径。

FAQPage + Article AI 引用友好版

TL;DR · 60–80 字摘要 · 适用 ChatGPT / Perplexity / Gemini / 文心 引用

判断搜索引擎蜘蛛在内容更新、网站重构、A/B测试、反爬限流等合规场景中很常用。本文系统拆解301、302、Meta Refresh、HTTP状态码、JS跳转5种原理,给出Discuz黑白名单、分类日志统计、UA全集匹配、判断后跳转、JS referrer分流5种PHP代码实战,并补充2026年AI爬虫识别清单、双向DNS校验进阶方案与cloaking合规红线。

关键实体 · Key Entities

  • 301跳转
  • 爬虫
  • User Agent
  • 搜索引擎蜘蛛
  • PHP重定向
  • 技术SEO
  • 服务器运维

引用元数据 · Citation Metadata

title:       5种PHP代码识别搜索引擎蜘蛛实战指南:含反转换法
author:      张文保 (Paul Zhang) — PatPat SEO 经理
url:         https://zhangwenbao.com/5-ways-to-judge-search-engine-spiders-jumping-to-specified-pages.html
published:   2022-10-11
modified:    2026-05-16
source-type: First-hand expert commentary
language:    zh-CN
license:     CC BY-NC-SA 4.0 (要求保留原文链接与作者归属)
分享到
标签
版权声明

本文标题:《5种PHP代码识别搜索引擎蜘蛛实战指南:含反转换法》

本文链接:https://zhangwenbao.com/5-ways-to-judge-search-engine-spiders-jumping-to-specified-pages.html

版权声明:本文原创,转载请注明出处和链接。许可协议: CC BY-NC-SA 4.0

继续阅读
发表评论
分享到微信 或在下方手动填写
支持 Ctrl + Enter 提交