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

ran*_*alt 10 nginx regex redirect 301-redirect

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

server {
  listen 80;
  server_name ~^(\w+)\.olddomain\.com$;

  rewrite ^ $scheme://$1.doma.in$request_uri? permanent;
}
Run Code Online (Sandbox Code Playgroud)

我已经阅读了很多其他问题,这个片段解决了这个问题。但是对我来说,Nginx 总是重定向到.domain.in,没有任何子域。我错过了什么?我已经针对 regex101 测试了正则表达式并且示例工作正常,Nginx 似乎无法重定向它。

kri*_*sFR 23

由于 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;
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以保留实际的 Regex 并$1return指令中使用:

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

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