Nginx将所有旧域子域名redirect到新域名

我有一个很长的领域,所以我决定把它改为更短,更友好的。 但是由于我有很多子域(实际上,我有一个子域通配符),我想保留子域而只更改域的一部分。 所以,我做了以下规则:

server { listen 80; server_name ~^(\w+)\.olddomain\.com$; rewrite ^ $scheme://$1.doma.in$request_uri? permanent; } 

我已经阅读了很多其他的问题,这段代码解决了这个问题。 但对我来说,Nginx总是redirect.domain.in ,没有任何子域名。 我错过了什么? 我已经testing了正则expression式对regex101和例子工作正常,Nginx似乎无法redirect。

由于nginx 0.8.25命名捕获可以在server_name中使用。 你应该使用它们。

在这里,子域将被存储在一个名为$sub的variables中。 那么你将能够在rewrite指令中重用它:

 server { listen 80; server_name ~^(?<sub>\w+)\.olddomain\.com$; rewrite ^ $scheme://$sub.doma.in$request_uri? permanent; } 

或者,您可以保留您的实际正则expression式,并在return指令中使用$1

 server { listen 80; server_name ~^(\w+)\.olddomain\.com$; return 301 $scheme://$1.doma.in$request_uri; } 

最后,请注意, return指令是redirect的最佳方法。 您可能会遇到陷阱使用rewriteredirect。