0

我有这样的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 与此重定向不匹配。它必须适用于任何参数。

有什么方法可以为任何查询字符串设置通配符吗?

4

1 回答 1

3

首先,您使用的是$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;
}

如果是邪恶的!

于 2018-11-30T14:18:05.663 回答