Nginx Lua中header_filter_by_lua块无法读取Content-Encoding问题咨询
为什么在header_filter_by_lua中读取不到Content-Encoding响应头?
这个问题其实是nginx的响应处理流程导致的,我之前排查类似问题时踩过这个坑,给你拆解一下:
核心原因:Content-Encoding头是在header_filter阶段之后才被添加的
当你开启了nginx的gzip压缩(gzip on;)时,nginx的处理顺序是这样的:
- 先执行
header_filter_by_lua里的代码,处理响应头 - 对响应体进行gzip压缩
- 压缩完成后,才会自动添加
Content-Encoding: gzip这个响应头
所以你在header_filter_by_lua阶段去读取这个头时,它还没被nginx生成出来,自然返回空或nil。
为什么User-Agent能读到?
User-Agent是请求头,从客户端发送请求时就携带了,nginx会把它存在ngx.var.http_user_agent里,不管哪个阶段都能直接读取,和响应头的生成逻辑完全不同。
解决方案:换个阶段读取
如果要获取这个自动添加的Content-Encoding头,需要把读取逻辑放到**body_filter_by_lua**阶段。这个阶段是在响应体处理完成后执行的,此时Content-Encoding头已经被nginx添加好了。
举个例子:
body_filter_by_lua_block { local ce_header = ngx.resp.get_headers()["Content-Encoding"] if ce_header then ngx.log(ngx.INFO, "Content-Encoding: ", ce_header) end }
另外要注意:如果是你自己通过ngx.header.content_encoding手动设置的头,那在header_filter阶段是能读到的,但如果是nginx自动生成的gzip头,就必须等到body_filter阶段。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

