Nginx可通过location配合return或rewrite拦截恶意扫描:匹配敏感路径(如/phpmyadmin)、恶意UA(如sqlmap)及高频请求,统一重定向至首页、陷阱页或返回404,避免暴露真实结构并干扰自动化工具。

在 Nginx 中,可以通过 location 配合 return 或 rewrite 实现对恶意扫描行为(如路径爆破、敏感文件探测、常见爬虫 UA)的识别与重定向拦截。核心思路是:匹配可疑请求特征,直接返回 301/302 跳转到一个无害页面(如首页、404 或自定义陷阱页),既避免暴露真实结构,又可干扰自动化工具。
匹配高频恶意扫描路径
攻击者常批量请求敏感路径(如 /phpmyadmin、/wp-admin、/git/、/backup.zip)。用正则 location ~* 精准拦截:
-
不区分大小写匹配常见扫描目标,例如:
location ~* ^/(phpmyadmin|wp-admin|wp-config\.php|\.git|\.env|backup\.(zip|sql|tar\.gz))$ { - 统一重定向到首页或伪装页面:
return 302 /?scanned=1;(加参数便于日志识别) - 也可返回 404 避免暴露存在性:
return 404;(更推荐用于未启用的功能路径)
按 User-Agent 拦截已知恶意爬虫
部分扫描器使用固定 UA(如 sqlmap、nmap、Golang-http-client),可在 location / 或全局 server 块中结合 if 判断(注意:仅限简单字符串匹配,避免复杂逻辑):
- 示例配置:
if ($http_user_agent ~* "(sqlmap|nikto|dirb|golismero|acunetix|nessus|nmap|masscan|Golang-http-client)") {return 302 https://$host/robots.txt;} - 注意:
if在location内可用,但不宜嵌套多层;优先用map提前定义变量提升性能(适用于高并发场景)
限制高频异常请求路径(配合 limit_req)
单纯匹配 UA 或路径可能被绕过。更有效的方式是:对疑似扫描的路径设置独立限流,超频即重定向:
- 先定义限流区域:
limit_req_zone $binary_remote_addr zone=scan:10m rate=5r/m; - 在对应 location 中启用并触发重定向:
location ~* ^/(admin|cgi-bin|scripts|test\.php) {limit_req zone=scan burst=2 nodelay;error_page 429 =302 /?rate_limited;} - 这样既控制频率,又让扫描器误以为“跳转成功”,实际无法继续探测
补充建议:避免误伤与增强隐蔽性
拦截策略需兼顾安全与可用性:
- 不要直接
deny all或返回 403——易被识别为防御存在;重定向更“自然” - 重定向目标建议用静态 HTML(如
/trap.html),内容可模仿登录页或 404,避免返回明显服务端信息(如 Nginx 版本) - 定期分析 access 日志,用脚本提取高频 404 路径,动态更新
location规则 - 生产环境慎用
if+ 复杂正则;关键规则尽量放在location块内,减少上下文依赖


















