我正在尝试将子文件夹redirect到nginx中的子域。 我希望将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文件的其他两个位置之上。