Apache RewriteRule 可通过 RewriteCond 标记异常请求环境变量(如 E=ABNORM:bad_host),再配合 CustomLog 的 env=ABNORM 和 %{ABNORM}e 实现精准审计日志,支持拦截(F)、重定向(R)或仅打标透传,适用于生产环境。

Apache 的 RewriteRule 本身不直接拦截并记录日志,但可以配合 RewriteCond、环境变量(E=)和 CustomLog 实现“统一拦截 + 可审计日志”的效果。核心思路是:用规则识别异常请求 → 打上标记 → 让日志格式捕获该标记。不依赖调试日志,适合生产环境长期运行。
识别并标记异常请求
先定义哪些算“异常”——比如非法 Host、恶意 User-Agent、可疑路径或缺失必要头信息。每类用一组 RewriteCond + RewriteRule 标记环境变量:
- 封禁未授权域名:
RewriteCond %{HTTP_HOST} !^(api\.example\.com|admin\.example\.com)$ [NC]RewriteRule ^ - [E=ABNORM:bad_host,L] - 拦截已知爬虫特征:
RewriteCond %{HTTP_USER_AGENT} "(sqlmap|nikto|wget|curl).*-I" [NC]RewriteRule ^ - [E=ABNORM:scan_probe,L] - 拒绝无 Referer 或空 UA 的敏感接口:
RewriteCond %{HTTP_REFERER} ^$ [OR]RewriteCond %{HTTP_USER_AGENT} ^$RewriteRule ^/api/(v1|internal)/.*$ - [E=ABNORM:no_ref_or_ua,L]
配置带标记的日志格式
在主配置或虚拟主机中定义一个自定义日志格式,把环境变量 ABNORM 加进去:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{ABNORM}e" abnorm_log
再启用该格式的访问日志:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
CustomLog "/var/log/apache2/abnormal_access.log" abnorm_log env=ABNORM
注意 env=ABNORM 表示只记录设置了 ABNORM 环境变量的请求,避免日志膨胀。
拦截动作与响应控制
标记只是第一步。真正拦截需搭配状态码标志:
- 返回 403 并记录:
RewriteRule ^ - [F,E=ABNORM:bad_host] - 重定向到统一提示页(仍可记录):
RewriteRule ^ /blocked.html [R=403,E=ABNORM:redirected,L] - 若需透传给后端做二次判断,可用
[E=ABNORM:flagged]不中断流程,仅打标供日志和后端识别
验证与排查要点
规则写完别急着上线,重点确认三件事:
- 确保
RewriteEngine On已开启,且所在作用域(VirtualHost或Directory)允许重写 - 检查
error_log中是否有mod_rewrite相关警告,例如条件语法错误或正则未闭合 - 临时加一条测试规则:
RewriteCond %{REMOTE_ADDR} ^127\.0\.0\.1$ [E=ABNORM:test_local],用本地请求验证日志是否出现test_local

















