phpEnv中Nginx UA拦截需在server块内、location/前添加if语句,用~*正则匹配黑名单(如sqlmap|curl)及空UA,避免放入location块内导致漏拦或502,配置后执行nginx -t验证并-s reload生效。

phpEnv 是 Windows 下集成 PHP + Nginx + MySQL 的环境套件,其 Nginx 配置路径通常为 C:\phpEnv\nginx\conf\nginx.conf 或 C:\phpEnv\nginx\conf\vhost\*.conf。直接在 server 块里用 if + $http_user_agent 是最简单有效的做法,但要注意 phpEnv 默认配置中常把 location / 块写得较复杂(含 try_files、fastcgi_pass 等),if 放错位置会导致 502 或静默失效。
在 phpEnv 的 vhost 配置中加 if 判断
找到你网站对应的虚拟主机配置文件(比如 C:\phpEnv\nginx\conf\vhost\localhost.conf),在 server 块内、location / 块**顶部**插入 if 语句:
server {
listen 80;
server_name localhost;
root "C:/phpEnv/www";
index index.php index.html;
<pre class='brush:php;toolbar:false;'># ? 放在这里:location 外、server 内,且必须在 location 前
if ($http_user_agent ~* "(sqlmap|nikto|curl|wget|python-requests|ZmEu|Sogou web spider)") {
return 403;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
...
}
location ~ \.php$ {
...
}}
-
if必须写在server块里,不能写在http块顶层(phpEnv 的 nginx.conf 里http块通常不开放自定义) - 正则用
~*表示忽略大小写,比~更稳妥;多个 UA 用竖线|连接,不用加括号(除非你要分组) - 不要把
if塞进location ~ \.php$里——那只会拦截 .php 请求,漏掉静态资源和目录遍历 - 避免写成
if ($http_user_agent = "curl"),这是全字匹配,实际 UA 字符串更长(如curl/8.6.0),必须用正则
屏蔽空 UA 或非常规格式(防基础扫描)
很多自动化工具发请求时不带 User-Agent,或设为空字符串、仅含空格/控制字符。这类请求几乎从不来自真实浏览器,可一并拦截:
立即学习“PHP免费学习笔记(深入)”;
- 匹配空 UA:
if ($http_user_agent = "") { return 403; } - 匹配仅空白或不可见字符:
if ($http_user_agent ~ "^[\s\x00-\x08\x0b-\x0c\x0e-\x1f]*$") { return 403; } - 注意:这两条要放在 UA 黑名单
if之前,否则空 UA 会跳过正则匹配而漏拦
验证是否生效(Windows 终端命令)
phpEnv 启动后,在 PowerShell 或 CMD 中执行以下命令测试:
- 模拟黑名单 UA:
curl -I -A "sqlmap/1.5" http://localhost→ 应返回HTTP/1.1 403 Forbidden - 模拟正常浏览器:
curl -I -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" http://localhost→ 应返回200 OK或302 - 检查语法是否正确:
C:\phpEnv\nginx\nginx.exe -t(路径以你实际安装为准) - 重载配置:
C:\phpEnv\nginx\nginx.exe -s reload(不是 restart,避免中断 PHP-FPM)
真正容易被忽略的是:phpEnv 的默认配置常把 location / 和 location ~ \.php$ 分开写,而 UA 检查必须覆盖全部入口;另外,Windows 下路径分隔符是反斜杠,但 Nginx 配置里一律用正斜杠,写错会导致 nginx -t 报错。



















