Hello!
2013/2/25 nan.yang:
>
> 在nginx配置文件中我需要记录cookie的值,但是使用$cookie_D第一次访问的时候,日志无法记录,我的目的就是想让nginx日志把第一次的cookie也记录下来
> 我的想法是把$sent_http_set_cookie 关于cookie值的那部分截取出来,写入日志就可以了
> 问题是 log_format abc '$sent_http_set_cookie’; 日志记录正常
> 但是 一旦我对$sent_http_set_cookie进行 正则、赋值操作,$sent_http_set_cookie’的值就会变成空
这里你完全搞反了。其实并不是因为你使用了 if + 正则匹配,而导致 $sent_http_set_cookie 的值被清空,而是因为在
if 这条配置指令执行时,响应压根还没有生成,自然不存在 Set-Cookie 这样的响应头,$sent_http_set_cookie
变量自然也就还没有初始化。
Nginx 中的配置指令都有其特定的运行阶段。if 等指令都运行在 rewrite 阶段(或者 server-rewrite
阶段),这是一个在请求生命期中很早的阶段。更多细节请参见我的 Nginx
连载教程:http://agentzh.org/misc/nginx/agentzh-nginx-tutorials-zhcn.html#02-NginxDirectiveExecOrder01
为解决你这里特定的问题,你至少有两种选项:
1. 可以同时在访问日志中记录 $cookie_XXX 和 $sent_http_cookie_XXX 的值;或者
2. 你可以使用 log_by_lua 或者 header_filter_by_lua 指令内嵌一小段 Lua
代码,在那里对这两种情形进行分别讨论,再把 cookie 值写进你自己的 $test_cookie 变量,供记日志之用。之所以
log_by_lua 和 header_filter_by_lua 在这里可行,是因为这两条配置指令都运行在响应头生成以后的时间点上。
Best regards,
-agentzh