使用 Nginx 将 URL 参数附加到请求 URI

使用 Nginx 将 URL 参数附加到请求 URI

我正在尝试将 URL 参数附加到服务器块内的特定请求 URI。

这是我目前所拥有的:

if ( $request_uri = "/testing/signup" ) {
    rewrite ^ https://www.example.com/testing/signup?org=7689879&type_id=65454 last;
}

location /testing/ {
    try_files $uri $uri/ /testing/index.php;
}

但是,这仅当原始请求 URI 没有任何自己的 URL 参数时才有效(例如www.example.com/testing/signup?abc=hello)我想保留原始的 URL 参数并添加我自己的参数。

我尝试将正则表达式更改为 if( $request_uri ~* "^/testing/signup" ) {但这会导致循环。

有人可以帮忙吗?

**** 更新 ****

我已更新并尝试此操作:

location /testing/ {
    rewrite ^/testing/signup$ /testing/signup?org=1231564 break;
    try_files $uri $uri/ /testing/index.php$is_args$args;
}

这不会传递 URL 参数,但检查日志时可以看到现有 URL 参数和新参数都在 args 变量中。但我如何将这些参数放入 GET 请求中,以便服务器能够对它们采取行动?

2021/08/03 02:27:07 [notice] 3202#3202: *27 "^/testing/signup$" matches "/testing/signup", client: 146.75.168.54, server: example.com, request: "GET /testing/signup?id=1 HTTP/2.0", host: "www.example.com"
2021/08/03 02:27:07 [notice] 3202#3202: *27 rewritten data: "/testing/signup", args: "org=1231564&id=1", client: 146.75.168.54, server: example.com, request: "GET /testing/signup?id=1 HTTP/2.0", host: "www.example.com"

答案1

欢迎来到 ServerFault。

变量请求 uri包含“完整原始请求 URI(带参数)”。这就是为什么带有现有参数的请求对原始代码不起作用的原因。相反,我们可以使用乌里那是规范化

可以通过检查必需参数是否存在来修复无限循环。由于 Nginx 不支持嵌套 if 条件,因此我们可以使用不同的逻辑。

因此,以下代码可以起作用......

error_page 418 @goodtogo;

location /testing/ {
    if ($arg_org != "") { return 418; }
    if ($arg_type_id != "") { return 418; }

    if ( $uri = "/testing/signup" ) { rewrite ^ /testing/signup?org=7689879&type_id=65454 redirect; }

    try_files $uri $uri/ /testing/index.php =404;
}

location / {}

location @goodtogo {
    try_files $uri $uri/ /testing/index.php =404;
}

请注意,原始参数会附加到我们手动添加的参数中。因此,对于像 这样的请求www.example.com/testing/signup?abc=hello,URI 会被重写为www.example.com/testing/signup?org=7689879&type_id=65454&abc=hello

相关内容