UA检测仅可作为轻量过滤层,需结合Referer、Cookie等多维度验证,统一收口至中间件,不可替代验证码或风控系统。

PHP网站可以通过检测 User-Agent(UA)字段识别并拦截常见爬虫,但需注意:UA可被轻易伪造,单独依赖它无法构成可靠防护,适合作为第一道轻量过滤层或辅助标记手段。
基础UA匹配拦截
在入口文件(如 index.php)或中间件中检查请求头中的 UA 字符串,对明确含爬虫标识的请求直接拒绝:
- 用 stripos() 或 preg_match() 判断 UA 是否包含
bot、spider、Baiduspider、Googlebot等关键词 - 返回标准 HTTP 403 状态码,并终止脚本:
header('HTTP/1.0 403 Forbidden'); exit; - 避免全等匹配(如
==),因真实浏览器 UA 变体极多,应使用模糊匹配
白名单机制(谨慎使用)
只允许已知合法浏览器 UA 访问,其余一律拦截:
- 将主流浏览器典型 UA 字符串(如 Chrome、Safari、Firefox 移动/桌面版)存入数组
- 用 in_array() 或更稳妥的 stripos() 匹配 UA 子串(例如检查是否含
Chrome或Mobile Safari) - 不建议在生产环境全程启用——会误杀部分隐私浏览器、旧设备或企业内网工具
结合其他信号增强判断
单看 UA 不足,应联动验证其他 HTTP 头和行为特征:
立即学习“PHP免费学习笔记(深入)”;
- 检查 Referer 是否为空或异常(如非本站域名却访问后台接口)
- 确认 X-Requested-With 是否缺失(真浏览器 AJAX 请求通常带该字段)
- 验证是否存在有效 Cookie(如会话 ID 或防跨站令牌),多数简单爬虫不维护 Cookie 状态
- 记录空 UA、纯数字 UA、含
python-requests/curl的请求,仅限流或打标,不直接封禁
部署建议与注意事项
实际应用中需兼顾效果与兼容性:
- 不要在每个控制器里重复写 UA 判断逻辑,统一收口到中间件或公共函数
- ThinkPHP、Laravel 等框架推荐用中间件处理,避免污染业务代码
- 宝塔面板用户可直接启用“Nginx 免费防火墙”的 UA 过滤规则,无需改 PHP 代码
- 禁止把 UA 检查当作安全屏障——它只能拦住懒爬虫,不能替代验证码、行为分析或风控系统



















