Nginx将所有旧域名子域名重定向到新域名

Nginx将所有旧域名子域名重定向到新域名

我的域名很长,所以我决定将其更改为更短、更友好的域名。但由于我有很多子域名(事实上,我有一个子域名通配符),我想保留子域名,而只更改域名部分。因此,我制定了以下规则:

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;
}

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

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

最后,请注意,return指令是重定向的最佳方法。您可能会遇到陷阱用于rewrite重定向。

相关内容