我正在尝试将 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
。