在Nginx中,如何redirect到另一个域,但也保留path和子域?

所以,例如,我有一个域olddomain.comnewdomain.com

以下是我希望redirect请求的方法:

sub.olddomain.com/hello/world -> sub.newdomain.com/hello/world olddomain.com/hello/world -> newdomain.com/hello/world

有很多子域名,所以理想情况下我不想为每个子域创build一个规则。

这似乎是一个解决scheme:

 server { listen 80; server_name olddomain.com *.olddomain.com; rewrite ^(/)(.*)$ http://newdomain.com/$2 permanent; } 

但它不适用于子域名,因为所有子域名将redirect到newdomain.com/path而不考虑子域名。

你似乎在寻找这样的东西:

 if ($http_host ~ (.*)\.olddomain\.com) { set $subdomain $1; rewrite (.*)$ http://$subdomain.newdomain.com$1 permanent; } rewrite ^(/)(.*)$ http://newdomain.com/$2 permanent; 

这些是我的testing用例

 $ curl -I -H "Host: test1.olddomain.com" nginx1.tst HTTP/1.1 301 Moved Permanently Server: nginx/1.4.4 Date: Thu, 08 May 2014 19:40:33 GMT Content-Type: text/html Content-Length: 184 Connection: keep-alive Location: http://test1.newdomain.com/ $ curl -I -H "Host: test1.test2.olddomain.com" nginx1.tst HTTP/1.1 301 Moved Permanently Server: nginx/1.4.4 Date: Thu, 08 May 2014 19:40:38 GMT Content-Type: text/html Content-Length: 184 Connection: keep-alive Location: http://test1.test2.newdomain.com/ $ curl -I -H "Host: test1.test2.olddomain.com" nginx1.tst/with-something/appended.html HTTP/1.1 301 Moved Permanently Server: nginx/1.4.4 Date: Thu, 08 May 2014 19:40:54 GMT Content-Type: text/html Content-Length: 184 Connection: keep-alive Location: http://test1.test2.newdomain.com/with-something/appended.html $ curl -I -H "Host: olddomain.com" nginx1.tst HTTP/1.1 301 Moved Permanently Server: nginx/1.4.4 Date: Thu, 08 May 2014 19:41:10 GMT Content-Type: text/html Content-Length: 184 Connection: keep-alive Location: http://newdomain.com/