【问题标题】:Get content of second Set-Cookie header with Lua使用 Lua 获取第二个 Set-Cookie 标头的内容
【发布时间】:2021-03-15 20:17:29
【问题描述】:

Nginx 有一个已知问题,如果设置了多个 Set-Cookie 标头,那么 Nginx 只能记录其中一个(仍然不确定是第一个还是随机的)。 因此,例如,如果后端设置

  1. “CSSESSIONID=XXXXXXXXXXXXXXX”
  2. “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,我已经更新了我的帖子,请你看看并告知为什么结果为空?

标签: nginx lua openresty


【解决方案1】:

在与 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 
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多