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


10

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

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

  rewrite ^ $scheme://$1.doma.in$request_uri? permanent;
}

我还阅读了许多其他问题,以解决此问题。但是与我一起,Nginx总是重定向到.domain.in,没有任何子域。我想念什么?我已经针对regex101测试了正则表达式,并且示例运行正常,Nginx似乎无法重定向它。

Answers:


22

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

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

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

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


完善。我使用了return方法,但仍将其命名为regex部分,这更容易理解。
ranisalt 2014年

如果我们也想在没有子域(www)的情况下进行重定向怎么办?例如:sub1.ex.to> sub1.new.in和ex.to> www.new.in?
R. Canser Yanbakan 2015年

1
请注意,“ \ w” 与域名中可能包含的某些字符匹配,例如“-”。因此,上述正则表达式将重定向test-sub.doma.in.domai.in
沃尔夫冈

对于其中包含-和_的子域,请使用[\ w \-\ __] +而不是\ w +
Sajjad Ashraf

是什么~在正则表达式做的开始?它没有用,因为某些东西会^在正则表达式中出现。
hobbes3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.