记录Cookie有什么用?
有时候我们需要通过web服务器的访问日志来统计UV(独立访客),并据此分析用户的行为。而UV是依据cookie数据得出的统计。UV相对于IP的好处是:IP是一个反映网络虚拟地址对象的概念,UV是一个反映实际使用者的概念,更加准确地对应一个实际的浏览者。使用UV作为统计量,可以更加准确的了解单位时间内实际上有多少个访问者来到了相应的页面。
如何记录Cookie?
Nginx:
在nginx的配置文件中,可以通过$http_cookie来访问Cookie.
想要记录Cookie,你需要修改nginx.conf配置文件。下面看一下具体的配置方法。
找到如下代码,
1 #log_format main '$remote_addr - $remote_user [$time_local] "$request" '2 # '$status $body_bytes_sent "$http_referer" '3 # '"$http_user_agent" "$http_x_forwarded_for"';
如果你要记录整个Cookie,在下面添加一个新的log_format
1 log_format access_with_cookie '$remote_addr - $remote_user [$time_local] "$request" '2 '$status $body_bytes_sent "$http_referer" '3 '"$http_user_agent" "$http_x_forwarded_for" "$http_cookie"';
然后在合适的位置上添加
access_log /usr/share/nginx/logs/access_with_cookie.log access_with_cookie;
如果你要记录Cookie的一部分,则你需要截取$http_cookie的内容。
现在假设我们在php中设置一个Cookie,
$http_cookie大概会是这样的
uuid=137C6BAE-DE1F-4F5F-51ED-5E1AA1B55A17
如果想仅仅记录 137C6BAE-DE1F-4F5F-51ED-5E1AA1B55A17。
则需要在nginx.conf的server段添加
1 if ($http_cookie ~* ".*uuid=(.*)(?:;|$)")2 {3 set $cookie_uuid $1;4 }
并修改logformat,用$cookie_uuid代替$http_cookie
上面的配置涉及到了nginx的正则表达式。我对于正则表达式也不是很了解,这里仅说一下我的理解,不保证正确。
$1代表正则表达式中第一个括号里边的内容。
好了,在nginx日志里记录Cookie大概就是上面这个样子。
Apache
nginx配置网络上的文章比较多,但Apache得相对少一些。把我的方法说明一下,原理是一样的,只是语法有些差别。
Apache已经预置了获取Cookie某个字段的方法:%{VARNAME}C,所以配置起来会相对简单一点。
编辑httpd.conf,找到下面的内容。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
在它之上加1行,
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{uuid}C\"" combined_with_cookie
%{VARNAME}C代表cookie中VARNAME的值。仅支持version 0 cookies。关于Apache的LogFormat可参考,有详细的说明。
修改
CustomLog "logs/access_log" common
为
CustomLog "logs/access_log" combined_with_cookie
另外整个Cookie的值可以使用%{Cookie}i获取。
以上仅是自己的经验总结,不保证其正确性,仅供参考。