php爬虫防护需协同nginx、安全组与业务逻辑:先ip白名单拦截,再token校验身份,辅以ua/referer识别,最后用redis或nginx限流防暴力扫描,并记录日志分析。

PHP本身不直接“配置”禁止爬虫,而是通过服务端逻辑与外围设施协同实现对API接口的爬虫防护。重点不是堵死所有非浏览器请求,而是识别并限制自动化、高频、无业务意图的调用行为。核心思路是:先拦来源,再验身份,最后控节奏。
设置IP白名单或限制访问来源
最基础也最有效的第一道防线。适用于内部系统、合作方调用等可信场景。
- 在Nginx配置中直接拦截(推荐):
location /api/ {<br> allow 192.168.10.0/24;<br> allow 203.208.60.1;<br> deny all;<br>} - PHP中简单校验(仅作补充,不可替代Nginx层):
$ip = $_SERVER['REMOTE_ADDR'];<br>if (!in_array($ip, ['192.168.10.5', '203.208.60.1'])) {<br> http_response_code(403);<br> exit('Forbidden');<br>} - 云服务器务必同步配置安全组,只放行必要IP段到API端口(如443或8000),避免暴露在公网面
强制API密钥或Token验证
仅靠IP不够——合法IP也可能被滥用。必须要求每次请求携带有效凭证。
- 在PHP接口入口处检查Header:
$token = $_SERVER['HTTP_AUTHORIZATION'] ?? '';<br>if (empty($token) || !hash_equals($valid_api_key, $token)) {<br> http_response_code(401);<br> exit('Unauthorized');<br>} - 使用Bearer格式更规范:
Authorization: Bearer abc123xyz,PHP中用str_replace('Bearer ', '', $token)提取 - 避免用GET参数传key(易泄露、进日志),禁用明文账号密码(Basic Auth仅限HTTPS内网)
结合User-Agent与Referer做辅助识别
不能单独依赖,但可作为风控信号增强判断,尤其针对简单脚本类爬虫。
- 拒绝明显非浏览器UA:
$ua = $_SERVER['HTTP_USER_AGENT'] ?? '';<br>if (preg_match('/bot|crawl|spider|curl|httpclient|python-urllib/i', $ua) || empty($ua)) {<br> http_response_code(403);<br> exit();<br>} - 限制Referer为自家域名(适用于前端调用的API):
$referer = $_SERVER['HTTP_REFERER'] ?? '';<br>$host = parse_url($referer, PHP_URL_HOST);<br>if ($host !== 'yourdomain.com' && $host !== 'admin.yourdomain.com') {<br> http_response_code(403);<br> exit();<br>}
实施速率限制防暴力扫描
爬虫常高频试探接口路径或参数。单IP或Token维度限流能显著提高其成本。
- 用Redis实现简易令牌桶(示例):
$key = 'rate_limit:' . ($token ?: $_SERVER['REMOTE_ADDR']);<br>$count = $redis->incr($key);<br>$redis->expire($key, 60); // 60秒窗口<br>if ($count > 60) { // 每分钟最多60次<br> http_response_code(429);<br> exit('Too Many Requests');<br>} - Nginx层限流更高效(推荐):
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=30r/m;<br>location /api/ { limit_req zone=api_limit burst=10; } - 记录异常请求日志(IP、UA、路径、耗时),便于后续分析封禁模式
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











