servername仅标识虚拟主机主域名,不参与user-agent拦截;真正拦截需结合请求头匹配与访问控制指令,如.htaccess中用rewritecond+rewriterule返回403,或directory块中用setenvifnocase+requireall实现。

ServerName 本身不用于拦截 User-Agent,它只是定义虚拟主机的主域名(如 example.com),纯标识作用,和请求头过滤无关。想拦截恶意 UA,得在 Apache 的访问控制层下手,而不是往 ServerName 里塞规则。
真正起作用的是 请求头识别 + 访问控制指令,核心就两点:匹配 UA 字符串、拒绝匹配后的请求。下面分场景说清楚怎么配:
用 .htaccess 拦截(共享主机/无 root 权限时最常用)
适合大多数网站,改完即生效(需确保 AllowOverride All 已启用):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (sqlmap|nmap|dirbuster|wfuzz|ffuf|gobuster|feroxbuster|python-requests/2\.[0-9]|go-http-client/2\.0|masscan|ltx71|dotnetcurl) [NC]
RewriteRule ^ - [F]
-
[NC]表示大小写不敏感 -
^匹配任意路径,确保全站生效 -
[F]直接返回 403 Forbidden,不跳转、不重写
如果还想防 UA 伪造,可叠加 Referer 和路径判断(比如只拦空 Referer + 访问 /admin/ 或 /phpmyadmin/ 的请求),但基础 UA 拦截已能挡住 80% 的工具扫描。
用 <directory></directory> 块配置(VPS/独立服务器推荐)
更高效、更可控,写在站点配置文件(如 httpd.conf 或虚拟主机配置里),必须放在 <directory></directory> 内:
<directory>
SetEnvIfNoCase User-Agent "(sqlmap|nmap|dirbuster|wfuzz|ffuf|gobuster|feroxbuster|python-requests/2\.[0-9]|go-http-client/2\.0|masscan|ltx71)" bad_bot
<requireall>
Require all granted
Require not env bad_bot
</requireall></directory>
-
SetEnvIfNoCase用正则匹配子串,sqlmap能命中sqlmap/1.8或sqlmap/2.0-dev -
Require all granted是放行前提,顺序不能颠倒,否则整目录 403 -
mod_setenvif和mod_authz_core在 Apache 2.4+ 默认启用,一般不用额外加载
注意事项:别白忙活
- UA 完全可伪造,这类拦截只对自动化扫描器、低门槛爬虫有效;真实攻击者换个浏览器 UA 就绕过
- 别封死所有非浏览器 UA,像
Baiduspider、Googlebot、DuckDuckBot这类合法爬虫要保留 - 如果发现拦截失效,说明对方用了随机 UA 或模仿 Chrome/Firefox,这时就得补上行为检测:比如单 IP 短时间请求数超限(用
mod_evasive)、缺失标准请求头(Accept、Accept-Language)、或访问敏感路径频率异常
不复杂但容易忽略。










