ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【网关开发】ngx.var.proxy_add_x_forwarded_for 获取不到数据问题

2022-07-07 10:36:35  阅读:184  来源: 互联网

标签:网关 end forwarded header add proxy openresty


相关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

标签:网关,end,forwarded,header,add,proxy,openresty
来源: https://www.cnblogs.com/zhaosc-haha/p/16453751.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有