我的域名很长,所以我决定将其更改为更短、更友好的域名。但由于我有很多子域名(事实上,我有一个子域名通配符),我想保留子域名,而只更改域名部分。因此,我制定了以下规则:
server {
listen 80;
server_name ~^(\w+)\.olddomain\.com$;
rewrite ^ $scheme://$1.doma.in$request_uri? permanent;
}
我读过很多其他问题,其中这个代码片段解决了问题。但对于我来说,Nginx 总是重定向到.domain.in
,没有任何子域。我错过了什么?我已经针对 regex101 测试了正则表达式,示例运行良好,Nginx 似乎无法重定向它。
答案1
从 nginx 0.8.25 开始,可以在 server_name 中使用命名捕获。您应该使用它们。
在这里,子域将存储在名为的变量中$sub
。然后您将能够在rewrite
指令中重复使用它:
server {
listen 80;
server_name ~^(?<sub>\w+)\.olddomain\.com$;
rewrite ^ $scheme://$sub.doma.in$request_uri? permanent;
}
或者,您可以保留实际的正则表达式并$1
在return
指令中使用:
server {
listen 80;
server_name ~^(\w+)\.olddomain\.com$;
return 301 $scheme://$1.doma.in$request_uri;
}
最后,请注意,return
指令是重定向的最佳方法。您可能会遇到陷阱用于rewrite
重定向。