nginx转发参数修改

由于业务的一些意外调整,我们可能都需要让nginx通过header或者args的变更来快速的实现后端服务的升级和切换。

现在需求是当某个api的请求url的参数含有redirect=true的时候,需要修改成redirect=false.

1
2
3
if ( $arg_redirect = "true") {
set $args '$args&redirect=false';
}

但是大家也看到了问题,这里只是在完成的参数又加了一个参数。 最终的url参数就变成了

1
/api?redirect=true&redirect=false

于是手动测试了一下,发现这样也可以生效。本着完整的测试,又测试了一下反着写的

1
/api?redirect=false&redirect=true

结果一样有效,查了下代码发现相同参数是放入到list中,然后取一个合集。所以只要这里有一个false,那结果就是false。但是哪天我要把false设置为true就不行了。

所以我们又改了一下nginx的相关参数

1
2
3
if ($args ~* (.*)(redirect=false)(.*)) {
set $args $1redirect=true$3;
}

这就完全满足了我们的需求了。不会出现相同参数出现2次的情况发生了。

顺便说一句,如果改header的话就用 proxy_set_header 就可以了,但是nginx里不支持在if里使用这个命令,怎么绕过取就看自己的了,一般用map什么的都可以。