You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止网站直接访问,仅允许Googlebot、Yandexbot通过谷歌进入?

修正后的代码方案(解决Googlebot无法访问的问题)

先说说你原来代码的几个核心问题:

  • 只依赖HTTP_REFERER判断太局限——Googlebot这类正规爬虫有时候会直接发起请求,不会带跳转来源,这时候就会被误拦截
  • 重复检查了google相关字符串,逻辑冗余
  • 完全没考虑Yandexbot的识别需求

下面是调整后的代码,既能满足「仅允许谷歌跳转+Googlebot/Yandexbot直接访问」的要求,也不会误拦合法爬虫:

// 获取请求的关键标识信息
$userAgent = isset($_SERVER['HTTP_USER_AGENT']) ? strtolower($_SERVER['HTTP_USER_AGENT']) : '';
$referer = isset($_SERVER['HTTP_REFERER']) ? strtolower($_SERVER['HTTP_REFERER']) : '';

// 定义允许的爬虫标识(转小写避免大小写匹配问题)
$allowedBots = ['googlebot', 'yandexbot'];
// 定义允许的跳转来源(谷歌全系列域名,可根据需求添加更多区域域名)
$allowedReferrers = ['google.com', 'google.co.uk', 'google.de', 'google.fr'];

// 判断是否为允许的爬虫
$isAllowedBot = false;
foreach ($allowedBots as $bot) {
    if (strpos($userAgent, $bot) !== false) {
        $isAllowedBot = true;
        break;
    }
}

// 判断是否来自谷歌跳转
$isAllowedReferrer = false;
foreach ($allowedReferrers as $domain) {
    if (strpos($referer, $domain) !== false) {
        $isAllowedReferrer = true;
        break;
    }
}

// 既不是允许的爬虫,也不是谷歌跳转过来的,直接拦截
if (!$isAllowedBot && !$isAllowedReferrer) {
    echo "Bye Bye";
    exit; // 必须加exit,防止后续业务代码继续执行
}

// 这里写你原本的业务逻辑,比如处理$id的代码
$id = $_GET['id'] ?? ''; // 建议加上空值判断,避免PHP未定义索引警告

关键细节说明:

  • User-Agent识别:正规搜索引擎爬虫会在请求头里明确带上自己的标识,这是识别爬虫最可靠的方式,避免直接访问被误拦
  • Referer辅助判断:针对普通用户从谷歌搜索跳转的场景,检查来源域名是否属于谷歌生态
  • 空值安全处理:用isset()处理请求头字段,避免出现PHP警告
  • exit语句:拦截后一定要终止脚本执行,防止后续代码泄露

另外补充一点:HTTP_REFERER是可以被伪造的,这个只能作为辅助验证;核心的爬虫识别还是靠User-Agent——正规搜索引擎的爬虫不会伪造自己的标识,所以这个判断是可靠的。

内容的提问来源于stack exchange,提问作者Tamerlan Memmedov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:13:47