nginx:将子文件夹redirect到子域

我正在尝试将子文件夹redirectnginx中的子域。 我希望将http://example.com/~meow/redirect到http://meow.example.com/ 。 我尝试了以下内容:

location ~ ^/\~meow/(.*)$ { rewrite ^(.*)$ http://meow.example.com$1 permanent; } 

但它不起作用。 它被我的位置块捕获用户目录

 location ~ ^/~([^/]+)/(.+\.php)$ { [...] } and location ~ ^/\~([^/]+)/(.*)$ { [...] } 

那么,我将如何做到这一点? 哦,我只想/喵/被redirect。 所有其他用户目录不应该改变。

你可以尝试使用这样的嵌套location

 location ~ ^/\~([^/]+)/(.*)$ { location ~ ^/\~meow/(.*)$ { rewrite ^(.*)$ http://meow.example.com$1 permanent; } [...] } 

静态位置对于你所要求的会更高效。 如果您阅读http://wiki.nginx.org/HttpCoreModule#location中的四条规则,您将看到一个位置^ _不会被正则expression式位置覆盖。 您似乎也想在redirect的同时去掉前导/喵喵声。 正确的做法是:

 location ^~ /~meow/ { rewrite ^/~meow(.*) http://meow.example.com$1 permanent; } 

顺便说一句,重写时没有理由捕捉整个uri。 当前的uri已经保存在$ uri中。

 rewrite ^(.*)$ http://meow.example.com$1 permanent; 

 rewrite ^ http://meow.example.com$uri permanent; 

始终产生相同的结果,而第二次重写效率更高,因为它是一个短路匹配,并且已经包含了您正在尝试捕获的内容。

正则expression式位置按照其在configuration文件中出现的顺序进行检查,并使用第一个肯定匹配。 这意味着,您的location ~ ^/\~meow/(.*)$必须位于configuration文件的其他两个位置之上。