推荐使用 SetEnvIf + Require not env 实现 UA 黑名单:先用 SetEnvIfNoCase 匹配 curl、python-requests 等 UA 设置 bad_bot 环境变量,再在 <RequireAll> 中同时配置 Require all granted 和 Require not env bad_bot。

用 SetEnvIf + Require not env 实现 UA 黑名单(推荐 Apache 2.4)
phpEnv 默认集成 Apache 2.4,必须用 mod_authz_core 语法,Deny from env 会直接报错 Invalid command 'Deny'。核心是两步:先设环境变量,再拒绝该变量匹配的请求。
-
SetEnvIfNoCase User-Agent "(?i)curl|python-requests|sqlmap|nikto" bad_bot——NoCase自动忽略大小写,(?i)是冗余但更显式;正则用子串匹配(如curl),别写^curl/.*$,否则漏掉libcurl或带空格的 UA - 必须包裹在
<Directory>或<Location>块内,且需显式放行基础访问:Require all granted和Require not env bad_bot要共存于<RequireAll>内,顺序不能反,否则全站 403 - 若 phpEnv 的站点根目录是
D:\phpEnv\wwwroot\,配置应加在对应<Directory "D:/phpEnv/wwwroot">块里,不是全局httpd.conf顶部
用 RewriteCond + RewriteRule 实现 UA 拒绝(兼容旧习惯)
如果你熟悉 .htaccess 风格,或 phpEnv 中已启用 mod_rewrite(默认开启),这条路更直观,但要注意模块加载和上下文限制。
- 确保配置块外有
LoadModule rewrite_module modules/mod_rewrite.so(phpEnv 通常已加载);配置必须放在<Directory>或虚拟主机内,.htaccess需AllowOverride All - 条件写法:
RewriteCond %{HTTP_USER_AGENT} (curl|wget|httpie) [NC]——%{HTTP_USER_AGENT}是标准变量名,别漏下HTTP_前缀;[NC]必须加,否则大小写敏感 - 动作写法:
RewriteRule ^ - [F]——^匹配任意路径,-表示不重写 URI,[F]直接返回 403;别写成RewriteRule .* - [F],.*在某些 Apache 版本可能触发重复匹配
常见 UA 字符串陷阱与误伤点
真实 UA 字符串比想象中松散,硬匹配极易漏判或误杀。比如监控脚本、CDN 预热、甚至某些 PHP cURL 封装库都可能含 curl。
- 浏览器 UA 里常混入
curl:如Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 curl/8.6.0—— 单纯匹配curl会干掉正常 Chrome 用户 - Python 请求默认 UA 是
Python-urllib/3.11,注意连字符和斜杠是字面量,正则要写成Python-urllib,不是python urllib - 某些扫描器伪造成浏览器但缺失关键头字段,比如没有
Accept或Accept-Language;单靠 UA 黑名单无法覆盖这类行为,得配合mod_evasive或自定义日志分析
验证配置是否生效的实操步骤
改完配置别急着重启,先做三件事:语法检查、模块确认、客户端模拟,否则白忙活。
立即学习“PHP免费学习笔记(深入)”;
- 进 phpEnv 控制台或命令行执行:
D:\phpEnv\Apache24\bin\httpd.exe -t,输出Syntax OK才继续;若报错,90% 是括号不匹配、</RequireAll>漏写或模块未启用 - 检查
mod_setenvif和mod_authz_core是否启用:打开D:\phpEnv\Apache24\conf\httpd.conf,确认有LoadModule setenvif_module modules/mod_setenvif.so和LoadModule authz_core_module modules/mod_authz_core.so - 用 curl 测试:
curl -A "sqlmap/1.7.2" http://localhost/ -I应返回403 Forbidden;curl -A "Mozilla/5.0" http://localhost/ -I应返回200 OK;注意 Windows 下 cmd 对引号处理弱,建议用 Git Bash 或 PowerShell
实际生效的关键不在正则多精巧,而在于你是否确认了 phpEnv 当前 Apache 版本、模块加载状态、以及配置所处的作用域层级——这三个地方错一个,UA 黑名单就形同虚设。



















