如何配置 nginx 以仅当请求的 uri 为 / 且特定查询参数尚不存在时添加查询参数?

如何配置 nginx 以仅当请求的 uri 为 / 且特定查询参数尚不存在时添加查询参数?

假设我感兴趣的查询参数是arg1=val1。我希望 nginx 仅在请求的 uri 是/且查询参数arg1不存在时添加查询参数。预期行为如下所示:

要求:

/

预计传递至后端:

/?arg1=val1

要求:

/?arg2=val2

预计传递至后端:

/?arg1=val1&arg2=val2

要求:

/path1

预计传递给后端(如果请求的 uri 不是,则不要添加参数/):

/path1

要求:

/?arg1=valx&arg2=val2

预计传递给后端(如果参数已经存在,则不要更改其值):

/?arg1=valx&arg2=val2

我尝试过的nginx.conf如下:

location / {
    if ($args !~ ^(.*)(arg1=)(.*)$) {
        rewrite ^(/)$ /?arg1=val1 last;
    }

    ......
}

但其并没有像预期的那样发挥作用。

我应该如何配置nginx才能实现预期的行为?

答案1

要仅匹配 /,请使用 =。尝试

location = / {
    if ($args = "") {
        set $args arg1=val1;
        # or rewrite / /?arg1=val1 last;
    }
    if ($args !~ "arg1=") {
        set $args $args&arg1=val1;
    }
}

您可以通过输入 server{} 块来获取调试输出,了解 nginx 如何处理您的指令:

error_log /var/log/nginx/error.log debug;

相关内容