Nginx 修改请求参数

Nginx 修改请求参数

最近有一个这样的需求:将 client 端请求参数的 udpPort 参数给抹掉,原请求 url 如下: /nacos/v1/ns/instance/list?app=unknown&healthyOnly=false&namespaceId=preview&clientIP=172.16.117.56&serviceName=xxx&udpPort=54795&clusters=

以上是 nacos client 请求服务提供者列表的接口,如果 udpPort 大于 0,则 nacos server 会向这个 ip 的这个端口推送数据,我是期望它不要推送,如果要它不推送,有两个方案:

  1. 禁止 nacos server 向外发送 udp 包;
  2. 使 client 传递的 udpPort 参数小于等于 0,该参数默认为 0;

禁用 udp 发包

禁用 udp 发包也简单:

sudo iptables -A OUTPUT -p udp -j DROP

恢复 udp 发包

禁用后,如需恢复可这样:

1
2
sudo iptables -L -n --line-number |grep 'udp'
sudo iptables -D OUTPUT xxx(序号)

nginx 修改请求参数

但是这会影响所有服务,所以想了一个别的招,用 nginx 代理,但是删除 udpPort 参数,配置如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
    listen         6802;
    listen [::]:6802;
    server_name    _;
    charset UTF-8;

    location / {
        if ($args ~ "^(.*)(&udpPort=.*)(&.*)$") {
            set $args $1$3;
        }
        proxy_pass http://ip:6802;
        proxy_connect_timeout 60s;
        proxy_read_timeout 60s;
        proxy_send_timeout 60s;
        gzip off;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header x-wiz-real-ip $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

这里 $args 是:

app=unknown&healthyOnly=false&namespaceId=preview&clientIP=172.16.117.56&serviceName=xxx&udpPort=54795&clusters=

正则表达式的第一部分是任意字符重复一或多次,第二部分是以 &udpPort= 开头,然后任意字符重复一或多次,第三部分是以 & 开头,然后任意字符重复一或多次,这样一来,其含义如下:
$1:app=unknown&healthyOnly=false&namespaceId=preview&clientIP=172.16.117.56&serviceName=xxx&
$2:&udpPort=54795
$3:&clusters=

最后,使用 set $args 将参数调整为 $1$3 即删除 &udpPort=54795

最后更新于