nginx+lua 过滤指定的 cookie

目录

   最近遇到了一个很奇葩的 bug,就是有用户反映访问跳主站,最后发现是用户的 cookie 中有中文,tomcat7 在解析 cookie 时如有中文直接抛出异常,
报 500 的错,tomcat6 和 tomcat8 都没有这个问题,但是我们线上又不能换 tomcat,只有想办法把这个中文的 cookie 去掉,这时就需要用到 nginx+lua
了,原生的 nginx 好像没法处理

处理脚本

set_by_lua $filtercookie '
-- 这里用正则表达式写我们要去掉的 cookie
key = {
       "[^%w]__jdv",
       "^__jdv",
       "[^%w]plusFlag_([^=]*)",
       "^plusFlag_([^=]*)",
       "[^%w]starFlag_([^=]*)",
       "^starFlag_([^=]*)",
}
function filterCookie(cookie,cookie_key)
        local ret = ""
        local i, j = string.find(cookie, cookie_key .. "=")
        if (i ~= nil) then
                ret = ret .. string.sub(cookie, 0, i-1)
                local m, n = string.find(cookie, ";", j)
                if (n ~= nil) then
                   ret = ret .. string.sub(cookie, n+1)
                end
        end
        return ret
end

local cookie = ngx.var.http_cookie

if cookie == "" or cookie == nil
then
    cookie = ""
else
for k,v in ipairs(key) do
    local t = "null"
    while(t ~= "")
    do
       t = filterCookie(cookie,v)
       if t ~= "" then
          cookie = t
       end
    end
end
end


return cookie
';
# 去掉指定的 cookie 值后把 ngx.req 中的 cookie 覆盖掉
rewrite_by_lua '
       ngx.req.set_header("Cookie",ngx.var.filtercookie)

';

目录