要单独记录被拦截的非法请求,需用环境变量标记(如blocked=1)并配合CustomLog env=blocked导出;mod_security可提供含规则ID、攻击类型的审计日志;Require拒绝等则记入error_log,需配合LogMessage和正确IP头解析。

Apache 本身不直接“拦截”请求(除非配合模块),但当你用 mod_rewrite、mod_security 或 Require 规则拒绝访问时,这些被阻断的请求默认仍会记入访问日志(access_log)——只是状态码是 403、404 或 444。要真正**区分并单独记录被拦截的非法请求**,关键在于:给这类请求打上标记,再用条件日志(env=)将其导出到独立文件。
用环境变量标记非法请求
这是最通用、不依赖额外模块的方法。核心思路是:在规则匹配到非法特征时,设置一个环境变量(如 blocked=1),然后让日志只记录带该变量的请求。
- 在
VirtualHost或主配置中启用mod_setenvif(通常已加载) - 用
SetEnvIf或RewriteRule ... [E=]设置变量:RewriteEngine On RewriteCond %{REQUEST_URI} \.\./|\.git/|WEB-INF/|\.env [NC,OR] RewriteCond %{QUERY_STRING} (union%20select|sleep%20?\() [NC] RewriteRule ^ - [E=blocked:1] - 定义一个仅记录被标记请求的日志格式和目标:
CustomLog logs/blocked_requests.log combined env=blocked
用 mod_security 记录 WAF 拦截详情
如果你启用了 mod_security,它自带详细拦截日志能力,比手工标记更精准,包含攻击类型、规则 ID、参数内容等。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 确保
SecAuditLog已配置(例如:SecAuditLog /var/log/apache2/modsec_audit.log) - 开启审计日志模式:
SecAuditLogRelevantStatus "^(?:4|5)"(记录所有 4xx/5xx 响应)或更严格地只记403 - 搭配
SecAuditLogParts ABCFHZ包含请求头、响应体、规则消息等完整上下文 - 拦截日志示例:
[Mon Jun 15 08:12:34 2026] [error] [client 203.0.113.22] ModSecurity: Access denied with code 403. Matched phrase "union select" at ARGS:q. [id "981203"] [msg "SQL Injection Attack"]
用错误日志补充关键上下文
对某些硬性拒绝(如 Require all denied 或 Deny from),Apache 会写入错误日志(error_log),虽然不如访问日志结构化,但能快速定位配置级拦截。
- 确保
ErrorLog路径可写,且LogLevel至少为warn - 在虚拟主机内添加明确拒绝规则,并利用
LogMessage注入说明:<Location "/admin"> Require all denied LogMessage "Blocked admin access attempt from %{REMOTE_ADDR}i" </Location> - 这样每条拒绝都会在 error_log 中留下带 IP 和意图的记录
避免日志误漏的关键细节
不是所有拦截都会进日志——有些动作会跳过日志环节,需特别注意:
-
RewriteRule .* - [F]会记入 access_log(状态码 403),但[R=444](Nginx 风格关闭连接)在 Apache 中不标准,慎用;若真要用,改用[R=403,L]确保可记录 - 静态资源(如
/favicon.ico)被拦截时容易被忽略,建议在日志条件中显式排除或保留——用SetEnvIf Request_URI "^/favicon\.ico$" dontlog可防止干扰 - 反向代理场景下,真实客户端 IP 在
X-Forwarded-For头里,务必在LogFormat中加入%{X-Forwarded-For}i,否则封禁和溯源都失去意义

















