有没有好的方法可以查看传入 Apache 的请求的详细版本?至少我想检查特定标头是否存在并检查其值。请求不是来自浏览器,因此查看它们发出的情况很棘手。我不确定我的自定义 HTTP 标头是否真的由客户端添加,因此调试我的 rewritecond 指令很困难。
答案1
您可以创建自定义包含标题的 LogFormat:
%{Foobar}i :Foobar 的内容:发送到服务器的请求中的标头行。其他模块(例如 mod_headers)所做的更改会影响此内容。如果您对大多数模块修改请求标头之前的请求标头感兴趣,请使用 mod_setenvif 将标头复制到内部环境变量中,并使用上面描述的 %{VARNAME}e 记录该值。
然后重复使用日志格式在您的 AccessLog 指令上
LogFormat "%v %h %l %u %t \"%r\" %>s %b %{MySpecialHeader}i " my_special_format
CustomLog logs/access_log_with_details my_special_format
或者甚至只用一行:
CustomLog logs/access_log_with_details "%v %h %l %u %t \"%r\" %>s %b %{MySpecialHeader}i"
更新:
关于 SetEnvIf 的说明:
这部分用于在任何内部重写开始时存储标头的值,然后,不是使用语法%{FOO}i
在过程结束时提取标头,而是使用%{MyEnvVar}e
在开始时备份的值来记录,这是记录环境变量的语法。
所以以这样的方式结束:
SetEnvIf MySpecialHeader "(.*)" BACKUPHEADER=$1
(... stuff and things ...)
CustomLog logs/access_log_with_details "init: %{BACKUPHEADER}e final: %{MySpecialHeader}i "
答案2
你也可以使用 mod_security 来实现:
http://static.askapache.com/httpd/mod_security/doc/modsecurity-manual.html#N107EE
LogFormat "%h %l %u %t \"%r\" %>s %{mod_security-body}n
答案3
2024 答案:使用mod_log_forensic和ForensicLog
指令。此指令需要一个参数,通常是您要记录到的文件名。但要小心 - 文件名是相对于 的ServerRoot
,可能未设置,并且可能默认为某个意想不到的地方,例如/etc/apache2
。