如何阻止网站直接访问,仅允许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
相关产品推荐
相关产品推荐

