这两天测试用lua获取源站响应时,总是获取不全,因为请求是通过proxy_pass至后端,简单的配置如下:
location /t1 {
content_by_lua '
local h = ngx.resp.get_headers()
for k, v in pairs(h) do
ngx.say(k, v)
end
';
proxy_pass http://test_backend;
}
全部响应头如下:
< HTTP/1.1 200 OK
< Server: openresty/1.5.11.1
< Date: Tue, 29 Apr 2014 07:04:41 GMT
< Content-Type: application/octet-stream
< Transfer-Encoding: chunked
< Connection: keep-alive
< Last-Modified: Mon, 28 Apr 2014 09:54:08 GMT
lua能够获取的Header只有一个Last-Modified Header:
2014/04/29 15:07:05 [error] 6950#0: *5 [lua] log_by_lua:9: ------resp headers------last-modified=Mon, 28 Apr 2014 09:54:08 GMT
原因分析如下:
1. 由于ngx_http_lua_ngx_resp_get_headers()获取响应头是来自r->headers_out.headers;
2. 在upstream机制中,并不是所有的Header都会list_push至headers_out.headers链表中,原因有以下两种情况:
a. 典型的有ngx_http_upstream_copy_content_type(),并不会将Header 入库至headers_out.headers的list链表;
b. 第二种情况是proxy模块忽略了部分源站的头,典型的头:ngx_http_proxy_hide_headers;
3. 综合所述,ngx_http_lua_ngx_resp_get_headers()考虑的情况相对较少,不能够完全获取经过proxy的所有头;