OpenResty写入响应头日志时出现table值拼接报错该如何解决?
报错根因
ngx.resp.get_headers() 接口的设计逻辑是:当响应中出现多个同名头部时,对应的取值会自动封装为Lua table类型,而非单个字符串。Set-Cookie 是最常见的多同名头部场景,和头值长度无关,只要上游返回多个Set-Cookie就会触发该类型不匹配错误,你之前的临时方案是通过硬编码脱敏跳过了类型问题,但没有解决通用场景的潜在风险。
合理解决方案
你可以增加一个简单的类型判断逻辑,兼容字符串和table两种值类型,同时可以保留你需要的Set-Cookie脱敏逻辑,修改后的完整配置如下:
set $resp_header ""; header_filter_by_lua_block { local rh = ngx.resp.get_headers() -- 新增通用值转字符串函数,兼容多值头部 local function to_str(val) if type(val) == "table" then -- 多值用分号分隔拼接,可按需修改分隔符 return table.concat(val, "; ") else return tostring(val) end end for k, v in pairs(rh) do -- 保留Set-Cookie脱敏逻辑,不需要可以删除 if k:lower() == "set-cookie" then ngx.var.resp_header = ngx.var.resp_header .. k.."=REDACTED " else ngx.var.resp_header = ngx.var.resp_header .. k.."="..to_str(v).." " end end }
方案优势
- 通用兼容所有多同名响应头部场景,不止是Set-Cookie,避免后续遇到其他多值头部时再次出现同类型报错
- 保留了原有头部日志的完整性,不需要强制脱敏所有多值头部,你也可以按需调整其他敏感头部的处理逻辑
- 性能损耗极低,类型判断和table拼接都是Lua原生轻量操作,不会对Nginx转发效率产生明显影响
内容的提问来源于stack exchange,提问作者doctemp09
相关产品推荐
相关产品推荐

