带有查询字符串的 Nginx 重定向映射

Nginx redirect map with query string

我有这样的 nginx 配置:

map $request_uri $target {
    /test1234 https://www.somedomain.com/new_url?source=Whosebug$is_args$args;
}

map $request_uri $target_code {
    /test1234 301;
}
server {
    listen 80 default;

    if ($target_code = 301) {
        return 301 $target;
    }
}

为了 /test1234 它有效,但如果我有 /test1234?test=1 或任何查询字符串,则 nginx 不匹配此重定向。 它必须适用于任何参数。

有没有办法为任何查询字符串设置通配符?

首先,您使用的是 $request_uri 变量,它包含带有参数的完整原始请求 URI,因此当请求有一些参数时,您的 map 指令将永远不会匹配。请改用 $uri 变量。

其次,假设您有一个请求http://yourdomain.com/test1234?test=test。在 $target 你会得到 https://www.somedomain.com/new_url?source=Whosebug?test=test。您可以在配置中使用额外的 map 指令来避免:

map $is_args $args_prefix {
    ? &;
}

map $uri $target {
    /test1234 https://www.somedomain.com/new_url?source=Whosebug$args_prefix$args;
}

最后,我建议在 server 配置块中使用 location 指令而不是 if,例如:

location = /test1234 {
    return 301 $target;
}

如果是evil!