我有这样的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与该重定向不匹配。
它必须适用于任何参数。
是否可以为任何查询字符串设置通配符?
答案 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!