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