PHP反爬虫脚本如何让真实用户停留在当前访问URL不重定向
问题根因
当前问题源于反爬虫脚本的原生逻辑缺陷:无论用户访问站点下的哪个路径,只要被判定为真实用户,都会强制重定向到站点首页,同时执行die()终止程序,导致后续页面业务逻辑完全无法执行。
之前将else分支改为返回401未生效的原因是:该分支对应真实用户的判定结果,修改后所有真实用户访问都会直接返回401状态码,自然无法正常访问页面。
修复方案
仅需要修改脚本末尾的判定逻辑,删除真实用户分支的重定向和终止逻辑,让网站原有业务代码正常执行即可:
修改前代码
if($Antibot->check() == true){ die(header("location: ".$config_antibot['bot'])); }else{ die(header("location: ".$config_antibot['real'])); }
修改后代码
if($Antibot->check() == true){ // 仅判定为爬虫时执行跳转并终止程序 header("Location: " . $config_antibot['bot'], true, 302); exit(); } // 判定为真实用户时不做任何处理,直接执行后续网站原有代码
可选优化建议
- 给curl请求增加超时配置,避免反爬虫接口故障导致全站无法访问:
在httpGet方法的curl配置中增加两行:curl_setopt($ch, CURLOPT_TIMEOUT, 2); // 接口请求超时时间设为2秒 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); // 连接超时时间设为1秒 - 增加路径白名单,对激活页、API接口等不需要校验的路径直接跳过反爬虫检查,减少不必要的性能损耗:
在调用$Antibot->check()前增加白名单判断逻辑:// 白名单路径前缀,可根据需求增减 $white_path_prefix = [ '/user/', // 用户激活相关路径 '/api/' // 接口相关路径 ]; $current_path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); foreach ($white_path_prefix as $prefix) { // PHP8.0及以上版本可用str_starts_with if (str_starts_with($current_path, $prefix)) { // 匹配到白名单直接跳过后续反爬虫校验 return; } // 低于PHP8.0版本可替换为以下判断逻辑 // if (substr($current_path, 0, strlen($prefix)) === $prefix) { // return; // } } - 重定向跳转时建议补全状态码,避免浏览器缓存异常跳转规则。
内容的提问来源于stack exchange,提问作者anchor luxury
相关产品推荐
相关产品推荐

