Apache通过SetEnvIfNoCase匹配User-Agent设环境变量,再用Require not env拦截;需置于<Directory>或<Location>块内,配合Require all granted生效,正则应宽松匹配子串如"curl"。
在 apache 虚拟主机中通过 setenvif 限制特定 user-agent,核心是“先标记、再拦截”:用正则匹配 ua 字符串设环境变量,再结合 require not env 拒绝访问。这不是直接过滤,而是一套轻量、无需额外模块的条件控制链。
配置位置与基本结构
必须将规则写在虚拟主机的 <Directory> 或 <Location> 块内(不能放在全局或 <VirtualHost> 顶层),否则不生效。典型结构如下:
-
SetEnvIfNoCase User-Agent "关键词" 环境变量名—— 不区分大小写匹配,推荐用此指令 -
<RequireAll>容器包裹放行与拦截逻辑 -
Require all granted—— 必须存在,作为基础放行策略 -
Require not env 环境变量名—— 实际拦截动作,顺序不可颠倒
正则写法要宽松且实用
User-Agent 字符串变化多,如 curl/8.6.0、python-requests/2.31.0、sqlmap/1.7.2#stable,硬写完整匹配极易失效。正确做法是抓特征子串:
- 单个工具:
SetEnvIfNoCase User-Agent "curl" bad_bot - 多个工具组合:
SetEnvIfNoCase User-Agent "(curl|wget|httpie)" bad_bot - 带版本或空格干扰的工具:
SetEnvIfNoCase User-Agent "sqlmap" bad_bot(比^sqlmap/.*$更可靠) - 需要严格大小写时才加
(?i),一般不用;NoCase已覆盖常见变体
Apache 2.4 的语法关键点
2.4 版本已废弃 Order/Deny/Allow,若混用会报错 Invalid command 'Deny'。务必确认三点:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 模块
mod_authz_core和mod_setenvif已启用(默认通常开启) - 不使用
Deny from env,只用Require not env -
Require all granted必须出现在Require not env之前,否则所有请求都被拒
可叠加其他限制提升实用性
单纯靠 UA 黑名单易误伤(如监控脚本也用 curl),建议组合使用:
- 加 IP 白名单:
Require ip 192.168.10.0/24放行内网运维 - 排除真实浏览器:
SetEnvIfNoCase User-Agent "Mozilla" good_browser,再用Require env good_browser反向白名单(需调整逻辑) - 配合 Referer 判断:
SetEnvIfNoCase Referer "^$" no_referer,拦截空来源 + 恶意 UA 的组合
注意:User-Agent 可被任意伪造,该方法仅适合压制低门槛扫描器和自动化爬虫,不能替代 WAF 或行为分析。

















