在 POST 的 NGINX 代理中替换请求 body
Replace request body in NGINX proxy for POST
我正在尝试使用 NGINX 来代理一个需要在中间做一些魔术的请求。本质上,我有一个只能发送未经身份验证的 GET 请求的客户端,我需要接收此请求,创建一个 POST 将使用存储在 NGINX 配置中的静态凭据登录服务器,并替换响应 body 与 html 重定向。这将适用于我的场景,因为 POST 响应将包含一个 Set-Cookie header 和一个 session id 代表经过身份验证的 session。我知道我可以使用 proxy_method
强制 NGINX 通过 POST 进行出站调用,并且我可以使用 sub_filter
将 POST 响应替换为 html重定向。我的问题是如何设置将在 POST 请求中发送的请求 body?
有什么想法吗?
伊恩
前段时间我花了很多时间研究这个问题,最好的解决方案似乎是使用 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}", "********")
';
# mask client_secret in gets
set_by_lua $request_mask '
local req = ngx.var.request_uri
return ngx.re.gsub(req, "(client_secret=).{8}", "********")
';
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
文件夹即可。
我正在尝试使用 NGINX 来代理一个需要在中间做一些魔术的请求。本质上,我有一个只能发送未经身份验证的 GET 请求的客户端,我需要接收此请求,创建一个 POST 将使用存储在 NGINX 配置中的静态凭据登录服务器,并替换响应 body 与 html 重定向。这将适用于我的场景,因为 POST 响应将包含一个 Set-Cookie header 和一个 session id 代表经过身份验证的 session。我知道我可以使用 proxy_method
强制 NGINX 通过 POST 进行出站调用,并且我可以使用 sub_filter
将 POST 响应替换为 html重定向。我的问题是如何设置将在 POST 请求中发送的请求 body?
有什么想法吗?
伊恩
前段时间我花了很多时间研究这个问题,最好的解决方案似乎是使用 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}", "********")
';
# mask client_secret in gets
set_by_lua $request_mask '
local req = ngx.var.request_uri
return ngx.re.gsub(req, "(client_secret=).{8}", "********")
';
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
文件夹即可。