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

时间:2018-11-30 12:53:12

标签: nginx nginx-config

我有这样的nginx配置:

map $request_uri $target {
    /test1234 https://www.somedomain.com/new_url?source=stackoverflow$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与该重定向不匹配。 它必须适用于任何参数。

是否可以为任何查询字符串设置通配符?

1 个答案:

答案 0 :(得分:1)

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

第二,假设您有一个请求http://yourdomain.com/test1234?test=test。在$target中,您将获得https://www.somedomain.com/new_url?source=stackoverflow?test=test。您可以在配置中使用其他map指令来避免这种情况:

map $is_args $args_prefix {
    ? &;
}

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

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

location = /test1234 {
    return 301 $target;
}

如果是evil