Nginx 重写服务器名称规则

Nginx 重写服务器名称规则

如果我想在 nginx 上执行重写规则:
访问 http://*1.abc.com
* = 任何单个字符
都会 301 重定向 http//*9.abc.com
所以我创建了以下配置:

server {
   listen 80 ;
   server_name ~^(.+?)1\.abc\.com$;
   rewrite ^/(.*) http://$19.abc.com permanent;
}

URL 将重写为:http//9.abc.com
有什么想法吗?

答案1

您在语句中有一个数字捕获server_name,并且在语句中有一个数字捕获rewrite

$1语句中的变量rewrite代表从同一语句中的正则表达式捕获的数字值rewrite

数字捕获总是被覆盖最后的要评估的正则表达式。

您可以使用命名捕获,其中可以在捕获和求值之间求值一个或多个正则表达式。请参阅这个文件了解详情。

例如:

server_name ~^(?<prefix>.+?)1\.example\.com$;
rewrite ^ "http://${prefix}9.example.com" permanent;

或者,您可以使用语句来避免任何中间的正则表达式return,例如:

server_name ~^(.+?)1\.example\.com$;
return 301 "http://${1}9.example.com$is_args$args";

当意图可能不明确时,我更喜欢使用${1}而不是。在这种情况下,表达式也需要加引号。$1附加$is_args$args可选的查询字符串,该字符串与原始rewrite语句的行为相匹配。

相关内容