laravel应用需通过中间件识别facebook、微信、抖音等合法爬虫并差异化限流:先用$request->header('user-agent')获取ua,再正则匹配特征字符串,接着校验官方ip段;匹配后按类型配置redis令牌桶或nginx前置限流,同时禁用trustproxies、手动提取真实ip,记录日志并实施延时响应策略。

你需要在Laravel应用中实时识别Facebook爬虫、微信内置浏览器、抖音小程序等高频采集流量,并对它们实施差异化限流,而不是一刀切屏蔽——因为部分爬虫(如Facebook external hit)需保留基础访问能力以保障链接预览功能正常。
识别真实User-Agent并排除伪造请求
第一步:在中间件中读取原始请求头中的User-Agent,而非依赖JavaScript或客户端上报值。【必须使用$request->header('User-Agent'),不能用$_SERVER['HTTP_USER_AGENT'],后者在Nginx反向代理下可能为空】
第二步:校验该UA是否匹配已知合法爬虫特征,例如facebookexternalhit/1.1、MicroMessenger、ToutiaoBot。使用正则而非strpos(),避免误判MicroMessenger被MicroMessage干扰。
第三步:对匹配到的UA,立即比对请求IP是否属于官方公布的IP段。Facebook爬虫IP段可从https://developers.facebook.com/docs/sharing/webmasters/crawler 获取,微信爬虫IP段见微信开放平台文档。不匹配者直接返回403,不进入后续逻辑。
按爬虫类型配置动态限流策略
方法一:基于Redis的令牌桶实现每分钟请求数控制
为facebookexternalhit设置每分钟60次,MicroMessenger设为每分钟120次,ToutiaoBot设为每分钟30次。使用Redis::throttle('ua:'.$uaHash)->allow(60)->every(60)封装调用,其中$uaHash = md5($ua . ':' . $ip)确保同一UA+IP组合独立计数。
方法二:Nginx层前置限流(推荐用于高并发场景)
在Laravel前的Nginx配置中添加limit_req_zone $ua_hash zone=fb_crawl:10m rate=1r/s;,再通过map指令将不同UA映射为不同哈希值:map $http_user_agent $ua_hash { ~*facebookexternalhit "fb:$remote_addr"; ~*MicroMessenger "wx:$remote_addr"; default "$binary_remote_addr"; }。此方式不经过PHP,响应更快。
注意:Nginx的limit_req默认返回503,若需返回429需配合error_page 503 =429 /429.html;重写状态码。
绕过UA伪造检测的关键动作
第一步:禁用Laravel默认的TrustProxies中间件对X-Forwarded-For的自动解析,改用$request->getClientIp(true)手动提取真实IP,防止攻击者伪造多级代理头污染IP判断。
第二步:对所有命中限流规则的请求,记录UA字符串前50字符 + IP + 时间戳 + 请求路径到数据库日志表,字段加索引。这一步不可跳过——后续优化UA白名单、识别新型爬虫都依赖此原始数据。
第三步:当某UA在5分钟内触发限流超10次,自动将其加入临时观察名单,下一小时对该UA的所有请求强制增加X-RateLimit-Delay: 2000响应头,并在日志中标记ua_suspicious。不封禁,但延时响应。











