繁体   English   中英

替换NGINX代理中的POST请求主体

[英]Replace request body in NGINX proxy for POST

我正在尝试使用NGINX代理一个需要在中间做一点魔术的请求。 本质上,我有一个只能发送未经身份验证的GET请求的客户端,我需要接收此请求,进行POST,以使用NGINX配置中存储的静态凭据登录服务器,然后将响应主体替换为html重定向。 这将适用于我的情况,因为POST响应将包含一个Set-Cookie标头,该标头的会话ID代表已认证的会话。 我知道我可以使用proxy_method强制NGINX通过POST进行出站呼叫,并且我可以使用sub_filter将html重定向替换为POST响应。 我的问题是如何设置将在POST请求中发送的请求正文?

有任何想法吗?

伊恩

Ubuntu 16.04和Ubuntu 18.04的工作示例

在此处输入图片说明

安装

# sudo apt purge nginx-*  # maybe necessary, backup your /etc/nginx/… configs before!
sudo add-apt-repository ppa:nginx/stable
sudo apt-cache show nginx-extras | grep -E '(xenial|bionic)'
sudo apt install nginx-extras  # Lua support (nginx-extras is > nginx-full)

配置

/etc/nginx/sites-available/test.conf

server
{
    listen 80;
    server_name test.example.com;

    location /
    {
        if ($request_method = POST)
        {
            access_by_lua_block
            {
                ngx.req.read_body()
                local req = ngx.req.get_body_data()
                local newreq, n, err = ngx.re.gsub(req, "REPLACE", "REPLACED")
                ngx.req.set_body_data(newreq)
            }
        }

        include proxy_params;
        proxy_pass http://target.local:80/;
    }
}

启用

cd /etc/nginx/sites-enabled
sudo ln -s ../sites-available/test.conf test.conf
sudo nginx -t
sudo service nginx reload  # or newer: sudo systemctl reload nginx

如果没有sites-available sites-enabled文件夹,只需将test.conf放入conf.d文件夹中。

我花了很多时间研究这个问题,最好的解决方案似乎是使用Lua。 有点痛苦。 我不得不用Lua编译NGINX。 我使用了OpenResty 我的用例需要屏蔽通过NGINX反向代理发布的敏感数据。 但是,它与您的绝对不同之处在于您正在使用proxy_method进行额外的POST,所以我不是100%会解决您的问题。 但是,我认为值得一试。 如果有帮助,这是我配置中的一小段代码。 如有需要,我们很高兴提供更多详细信息。

location /login {
    set $request_body_mask "";

        # mask client_secret in posts
        access_by_lua '
            local req = ngx.req.get_body_data()
        ngx.var.request_body_mask = ngx.re.gsub(req, "(client_secret=).{8}", "$1********")
    ';

    # mask client_secret in gets
    set_by_lua $request_mask '
        local req = ngx.var.request_uri
        return ngx.re.gsub(req, "(client_secret=).{8}", "$1********")
    ';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM