如何使用 apache 在请求标头中记录 cookie 的大小

如何使用 apache 在请求标头中记录 cookie 的大小

我们网站上有一个问题,就是 Cookie 变得太大了。目前,我们已经扩大了可接受的标头大小,并限制了 Cookie 的大小,但我想弄清楚客户端的平均标头大小是多少,特别是 Cookie 的大小。

我创建了一个 apache 日志来捕获每个请求中设置的 cookie:

LogFormat "%{Cookie}i" cookies

但这只会吐出标题中所有 cookie 的全部内容。

有没有办法让 apache 只记录每个请求的大小(或者只是字符串的长度)?

答案1

据我所知不是 :(

但是您可以做的不是直接写入日志文件,而是使用 Apache 的功能,使用管道并在将日志行写入文件之前对其进行解析。

...
LogFormat "%{Cookie}i" cookies
CustomLog "| /usr/local/bin/cookiecutter.awk" cookies

示例 awk 脚本可能如下所示:

#! /bin/awk -f
# /usr/local/bin/cookiecutter.awk
{
   print length($0) >> "/var/log/apache/cookielength_log"
}

一些附加字段(例如浏览器识别字符串)也可能有用,请发挥您的想象力。

答案2

除了记录 cookie 大小之外,您还可以记录超过一定长度的 cookie 的内容。注意:此解决方案需要 apache 2.4。

假设你想记录上面的 cookies8190字节(这是限制请求字段大小),在 httpd.conf 中使用它

# Increase LimitRequestFieldSize so it'll let cookies above 8190 pass
LimitRequestFieldSize 12000

# Set an environment variable if the value of the Cookie header 
# matches a string with more than 8190 characters
SetEnvIfExpr "req('Cookie') =~ /^.{8190,}$/" COOKIE_ABOVE_LIMIT

# Define a log format that logs the cookie contents
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Host}i\" \"%{Referer}i\" \"%{User-Agent}i\" \"%{Cookie}i\" %{ms}T" log_cookie

# Create a conditional log rule that will log only if the 
# the environment variable is set
CustomLog "/var/log/httpd/cookie_above_limit_log" log_cookie env=COOKIE_ABOVE_LIMIT

相关内容