下面这段小程序,我想用lua访问memcached来保存和读取缓存。但是有几个问题:1 缓存都出来的header有重复的Content-Type,但是访问backend拿到的header是正常的。怎么避免这个重复的header? 2 缓存出来的结果,会自动加上Transfer-Encoding: chunked,然后客户端会报Problem (2) in the Chunked-Encoded data。需要手动再加上Content-Length才可以,但是访问backend时候是正常的。请问这是什么原因造成的?
< HTTP/1.1 200 OK
* Server openresty/1.5.11.1 is not blacklisted
< Server: openresty/1.5.11.1
< Date: Sat, 12 Apr 2014 15:20:04 GMT
< Content-Type: text/plain
< Connection: close
< Vary: Cookie, User-Agent, Accept-Language
< Content-Type: text/html; charset=utf-8
60 content_by_lua '
61 local header_key = "header__" .. ngx.var.uri
62 local body_key = "body__" .. ngx.var.uri
63 local memcached = require "resty.memcached"
64 local memc = memcached:new()
65 memc:connect("127.0.0.1", 11211)
66 header, flags, err = memc:get(header_key)
67 body, flags, err = memc:get(body_key)
68
69 if header and body then
70 ngx.status = ngx.HTTP_OK
71 ngx.header["Content-Length"] = string.len(body)
72 for k,v in string.gmatch(header, "(%w+): (.+)") do
73 ngx.header[k]=v
74 end
75 ngx.print(body)
76 else
77 local res = ngx.location.capture("/wiki".. ngx.var.uri)
78 local value = ""
79 ngx.status = ngx.HTTP_OK
80 for k,v in pairs(res.header) do
81 ngx.header[k]=v
82 value = value .. k .. ": " .. v .. "\\r\\n"
83 end
84 ngx.print(res.body)
85
86 local ok, err = memc:set(header_key, value)
87 local ok, err = memc:set(body_key, res.body)
88 if not ok then
89 ngx.log(ngx.ERR, "cannot set memcached: ", err)
90 end
91 end
92 ';