如果我想在 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
语句的行为相匹配。