带有查询字符串的 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!
我有这样的 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!