【发布时间】:2021-03-15 20:17:29
【问题描述】:
Nginx 有一个已知问题,如果设置了多个 Set-Cookie 标头,那么 Nginx 只能记录其中一个(仍然不确定是第一个还是随机的)。 因此,例如,如果后端设置
- “CSSESSIONID=XXXXXXXXXXXXXXX”
- “JSESSIONID=XXXXXXXXXXXXXXX”
然后在访问日志中使用 $sent_http_set_cookie 变量可以只记录 CSESSIONID,即使在客户端它也会被视为单个标头 设置Cookie:CSSESSIONID=XXXXXXXXXXXXXXX,JSESSIONID=XXXXXXXXXXXXXXX
我使用 OpenResty,问题是如何访问响应头数据并获取第二个 cookie 的值(在我的例子中是 JSESSIONID)?
更新
我试图在我的服务器部分使用这个 sn-p 将 JSESSIONID 提取到 resp_header 变量中,但它是空的。
任何想法表示赞赏
set $resp_header "";
header_filter_by_lua_block {
local headers, err = ngx.resp.get_headers()
if err then
ngx.log(ngx.ERR, "err: ", err)
return ngx.exit(500)
end
for k, v in pairs(headers) do
if k:lower() == "set-cookie" then
local set_cookie = v
if (type(set_cookie) == "table") then
for key, value in pairs(set_cookie) do
if string.match(value:lower(), "jsessionid") then
val = string.match(value:upper(), "JSESSIONID=[%a%d]+")
ngx.var.resp_header = val
end
end
end
end
end
}
【问题讨论】:
-
如何使用
upstream_cookie_jsessionid变量? -
谢谢,但似乎它容易受到同样问题的影响——有时我看到正确的值,有时看到一些垃圾。从描述中我们可以看到解释:“仅保存最后一个服务器响应的标头字段”。所以我相信检查和过滤整个 Set-Cookie 标头是唯一的方法
-
那我觉得你需要手动迭代
ngx.resp.get_headers函数返回的表。 -
@IvanShatsky,我已经更新了我的帖子,请你看看并告知为什么结果为空?