使用 Lua 获取第二个 Set-Cookie 标头的内容

Nginx 存在一个已知问题,即如果设置了多个 Set-Cookie 标头,则 Nginx 只能记录其中一个(仍然不确定是第一个还是随机的一个)。 例如,如果后端设置了如下两个标头:

  1. "CSESSIONID=XXXXXXXXXXXXXXX"
  2. "JSESSIONID=XXXXXXXXXXXXXXX"

那么在访问日志中,只能记录 CSESSIONID,即使在客户端看起来是单个标头 Set-Cookie: CSESSIONID=XXXXXXXXXXXXXXX,JSESSIONID=XXXXXXXXXXXXXXX

我使用 OpenResty,问题是如何访问响应标头数据并获取第二个 cookie 的值(在我的情况下是 JSESSIONID)?

更新

我尝试使用以下在服务器部分中提取 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
    }
点赞
用户1542755
用户1542755

经过一些 Lua 的挣扎,我得到了以下解决方案(需要处理仅有单个 Set-Cookie 的情况):

set $resp_header='';
header_filter_by_lua_block {
  if ngx.var.uri == "/v1/auth" then
      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=([%w]+)")
                ngx.var.resp_header = val
              end
            end
          elseif (type(set_cookie) == "string") then
            val = string.match(set_cookie:upper(), "JSESSIONID=([%w]+)")
            ngx.var.resp_header = val
          end
        end
      end
  end
}
2020-12-24 16:28:36