phpEnv中Nginx配置文件位于C:\phpEnv\nginx\conf\nginx.conf(主配置)和C:\phpEnv\nginx\conf\vhost\下站点配置文件;map指令须置于http块顶层,不可写在vhost内,修改后需通过phpEnv控制面板重启Nginx生效。

phpEnv 是 Windows 下集成环境,其 Nginx 配置方式与标准 Nginx 一致,但默认配置文件位置、权限和 reload 方式有差异。禁止特定 User-Agent 的核心逻辑不变,但直接套用 Linux 或 macOS 的做法容易失败——尤其是 map 指令若写错位置,或未重启 phpEnv 内置服务,配置将完全不生效。
phpEnv 中 Nginx 配置文件在哪?
phpEnv 的 Nginx 配置文件不在 /etc/nginx/,而在:
-
C:\phpEnv\nginx\conf\nginx.conf(主配置) -
C:\phpEnv\nginx\conf\vhost\下的站点配置文件(如default.conf)
⚠️ 关键点:phpEnv 不支持在 vhost 文件里写 map —— 因为 map 必须位于 http 块顶层,而 phpEnv 的 vhost 是被 include 进来的,http 块只在 nginx.conf 里。所以你要改的是 nginx.conf,不是 vhost 文件。
在 nginx.conf 中安全添加 User-Agent 黑名单
打开 C:\phpEnv\nginx\conf\nginx.conf,找到 http { ... } 块,在它内部、server 块之前插入:
立即学习“PHP免费学习笔记(深入)”;
map $http_user_agent $blocked_ua {
default 0;
~* (sqlmap|nikto|curl|wget|python-requests|ZmEu|Bytespider) 1;
~* ^$ 1; # 屏蔽空 UA
}然后在对应 server 块的 location / 内加判断:
location / {
if ($blocked_ua) {
return 403 "Access denied.";
}
try_files $uri $uri/ /index.php?$args;
}注意:if 放在 location 内是安全的;不要把它提到 server 块顶层,否则可能干扰 php-fpm 的 fastcgi_pass。
修改后 phpEnv 不生效?检查这三步
phpEnv 的 Nginx 不是系统服务,不能用 nginx -s reload:
- 必须用 phpEnv 控制面板 → 点击「Nginx」右侧的「重启」按钮(不是「停止→启动」)
- 或者进命令行,以管理员身份运行:
C:\phpEnv\nginx\nginx.exe -t校验语法,再点面板重启 - Windows 下路径含中文或空格会导致
map解析失败,确认nginx.conf文件编码是 UTF-8 无 BOM
测试时用 curl -A "sqlmap/1.0" http://127.0.0.1,别只靠浏览器——浏览器 UA 通常不会被拦。
为什么不用纯 if + return 写在 vhost 里?
可以,但风险高:
- vhost 文件每次被 phpEnv 自动更新(比如切换 PHP 版本)可能被覆盖
- 多个
if ($http_user_agent ~* "...")并列写,正则冲突或漏匹配概率上升 - 无法区分“空 UA”和“合法 UA 但含关键词”,
map支持优先级顺序,更可控
真正难的不是写规则,而是让 phpEnv 认出你改了配置并严格执行——它对配置热加载不敏感,重启动作必须走控制面板,这点和原生 Nginx 完全不同。



















