nginx层硬拦截(deny+include)、thinkphp中间件动态封禁(行为识别+自动写入黑名单+reload)、real_ip严格校验真实ip(防x-forwarded-for伪造)构成三层高效防护机制。

ThinkPHP 本身不直接提供 IP 黑名单功能,但结合 Nginx 配置、应用层中间件和动态脚本,可以高效封禁恶意爬虫(如 OpenAI 的非法高频抓取)。关键不是“在 ThinkPHP 里写个黑名单数组”,而是构建可生效、可更新、不绕过代理头的三层拦截机制。
一、Nginx 层硬拦截(最优先,防穿透)
这是真正起效的第一道防线,所有请求在到达 PHP 前就被拒绝,零资源消耗。
- 在宝塔面板【网站】→【配置文件】中,于
server { }块内合适位置(建议放在所有location之前)添加:include /www/wwwroot/你的域名/ip_blacklist.conf;
路径需替换为实际站点根目录,确保 Nginx 有读权限。 - 创建
/www/wwwroot/你的域名/ip_blacklist.conf文件,内容格式为:deny 203.0.113.45;<br>deny 198.51.100.0/24;
- 保存后点击【重载配置】或执行
nginx -t && nginx -s reload生效。
二、ThinkPHP 中间件动态封禁(应对试探性爬虫)
仅靠静态黑名单不够——爬虫换 IP、用代理。需在应用层识别异常行为(如 1 分钟内访问 50+ 未定义路由),自动写入黑名单并触发 Nginx 重载。
- 新建中间件
app/middleware/IpBanMiddleware.php,在handle()中:
• 调用$request->ip()获取真实客户端 IP(确保已正确配置trust_proxies和 Nginxrealip模块);
• 使用Cache::tag('ip_ban')->get($ip, 0)统计该 IP 当前分钟内非白名单路径访问次数;
• 若超阈值(如 ≥20),调用file_put_contents(..., "deny {$ip};\n", FILE_APPEND)追加到 Nginx 黑名单文件,并执行shell_exec('nginx -s reload 2>&1')立即生效。 - 在
app/middleware.php中注册该中间件,作用于admin或api等高危分组。
三、严格校验真实 IP,防 X-Forwarded-For 伪造
很多封禁失效,是因为没处理好代理头。Cloudflare、阿里云 SLB、Nginx 反向代理都会影响 IP 识别。
- 在 Nginx 入口配置中:
• 对外层(接用户/CDN):强制覆盖proxy_set_header X-Forwarded-For $remote_addr;;
• 启用realip模块:set_real_ip_from 192.168.1.0/24;(填你 Nginx 所在内网段);real_ip_header X-Forwarded-For;;real_ip_recursive on; - 在 ThinkPHP 配置
config/app.php中:'trust_proxies' => ['192.168.1.0/24'],
确保Request::ip()返回的是经 Nginx 修正后的真 IP,而非被伪造的 HTTP 头。
四、补充:敏感路径强保护(防路由遍历类爬虫)
OpenAI 爬虫常伴随暴力探测 /runtime、/vendor、.env 等路径,需额外加固。
- 在 Nginx 配置中添加:
location ~ ^/(runtime|vendor|\.env|\.git|\.svn) { deny all; } - 在
config/route.php中强制开启:'url_route_must' => true,
并设置兜底:Route::miss(function () { abort(404); });
避免隐式路由暴露控制器结构。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











