Nginx拦截恶意爬虫的核心是“识别+拦截+限流”三层结合:通过if指令在server块顶层匹配UA、禁用非常规方法、屏蔽高危路径,配合limit_req_zone按IP或UA限流,并集中管理规则确保HTTPS/HTTP双生效、覆盖所有入口。

直接在 Nginx 配置中拦截恶意爬虫访问 PHP 网站,核心是“识别 + 拦截 + 限流”三层结合,不依赖插件或外部服务,生效快、开销低。关键不是只封 UA 或只限速,而是让规则覆盖所有可能入口(包括静态资源、PHP 脚本、后台路径),同时避免误伤搜索引擎和真实用户。
按 User-Agent 主动识别并拦截常见恶意工具
恶意爬虫常暴露特征,比如固定 UA 字符串。用 if + ~* 在 server 块顶层统一判断,比分散写在每个 location 更可靠:
- 屏蔽典型扫描/采集工具:
if ($http_user_agent ~* "(python-requests|curl|wget|scrapy|go-http-client|sqlmap|ZmEu|masscan)") { return 403; } - 拒绝空 UA 或极简 UA(多数自动化脚本不带):
if ($http_user_agent = "") { return 403; } - 禁用非常规 HTTP 方法(如 PUT、DELETE):
if ($request_method !~ ^(GET|HEAD|POST)$) { return 403; }
注意:这些规则必须放在 server 块内、所有 location 外;若站点启用了 HTTPS,HTTP 和 HTTPS 的 server 块都要加。
限制 PHP 脚本的直接访问与执行权限
爬虫常尝试遍历 /wp-admin/、/phpmyadmin/ 或构造恶意 PHP 请求。可在全局或特定 location 中强化防护:
立即学习“PHP免费学习笔记(深入)”;
- 禁止任意路径下执行 PHP:
location ~ \.php$ { deny all; }(适合纯静态站或 API 前端) - 仅允许指定目录执行 PHP(如只放行
/public):location /public { location ~ \.php$ { fastcgi_pass ... } },其他路径一律deny all - 屏蔽高危路径(返回 404 避免泄露存在性):
location ~* ^/(phpmyadmin|wp-admin|adminer|\.git|\.env|backup\.zip) { return 404; }
对可疑流量叠加请求频率控制
单靠 UA 封禁容易被伪装绕过,必须配合限流压低实际攻击能力:
- 定义通用限流区:
limit_req_zone $binary_remote_addr zone=perip:10m rate=5r/s; - 在
location /中启用:limit_req zone=perip burst=10 nodelay; - 对已识别为恶意的 UA,单独设更严策略(如每分钟 1 次):
limit_req_zone $http_user_agent zone=badua:10m rate=1r/m;,再在 if 后调用
这样即使爬虫换 UA 或代理,IP 层限流仍能兜底。
集中管理与安全上线要点
把黑名单和规则抽离成独立文件,方便维护和脚本更新:
- 新建
/www/server/nginx/conf/anti-crawler.conf,放入 UA 判断、路径屏蔽等规则 - 在网站配置的
server块中添加:include /www/server/nginx/conf/anti-crawler.conf; - 修改后先运行
nginx -t检查语法,再重载(nginx -s reload),不要重启 - 用 curl 模拟测试:
curl -H "User-Agent: sqlmap/1.7" https://yoursite.com/test.php,确认返回 403 - 检查日志:
tail -f /www/wwwlogs/yoursite.log | grep "403",验证拦截是否命中
若网站前端有 CDN,需改用 $http_x_forwarded_for 并启用 real_ip 模块,否则封的是 CDN 节点 IP。



















