ngx.var.proxy_add_x_forwarded_for 获取不到数据问题

相关issue

https://github.com/openresty/lua-nginx-module/issues/1115

网关采用nginx + lua 进行的功能扩展,在lua中使用ngx.var.proxy_add_x_forwarded_for获取不到值
查看该issue应该是跟版本有关,我们的openresty是1.11.2版本
这是因为这些proxy_*变量是用官方nginx核心中设置的NGX_HTTP_VAR_NOHASH标志定义的,该标志禁止通过变量名检索运行时值。
所以openresty 通过自定义补丁来实现标志的移除
目前是移除了$proxy_host 和 $proxy_port 的禁止标记,但是proxy_add_x_forwarded_for 并没有进行移除,所以需要新的补丁。
https://github.com/openresty/openresty/blob/master/patches/nginx-1.11.2-proxy_host_port_vars.patch

源码查看

其实查看源码也可以看出。
1.11.2源码

1.13.6源码

就是相关的屏蔽过程

解决方法

可以更新补丁,重新编译一下,或者升级openresty
但是一般生产环境,重新编译或者升级openresty都是有比较高的风险的。
最简单的处理方法可以我们自己拼接proxy_add_x_forwarded_for的值,直接修改调用ngx.var.proxy_add_x_forwarded_for的lua代码
示例:

function get_proxy_add_x_forwarded_for()
    local headers=ngx.req.get_headers()
    local xff = getxff(headers)
    local proxy_add_x_forwarded_for = ngx.var.remote_addr
    if xff and proxy_add_x_forwarded_for then
        proxy_add_x_forwarded_for = xff ..","..proxy_add_x_forwarded_for
    end
    return proxy_add_x_forwarded_for
end


-- getxff 是获取"x-forwarded-for的函数
function getxff(headers)
    local header = headers["x-forwarded-for"]
    if not header then
        return nil
    end
    if type(header) == "table" then
        header = header[1]
    end
    local from, to, err = re_find(header, [[^\d+\.\d+\.\d+\.\d+]], "isjo")
    if from then
        return str_sub(header, from, to)
    else
        return nil
    end
end
posted @ 2022-07-07 10:20  zscbest  阅读(535)  评论(0编辑  收藏  举报