我正在尝试将子文件夹重定向到 nginx 中的子域。我想要http://example.com/~meow/重定向至http://meow.example.com/。我尝试了以下方法:
location ~ ^/\~meow/(.*)$ {
rewrite ^(.*)$ http://meow.example.com$1 permanent;
}
但它不起作用。它被我的用户目录位置块捕获:
location ~ ^/~([^/]+)/(.+\.php)$ {
[...]
}
and
location ~ ^/\~([^/]+)/(.*)$ {
[...]
}
那么,我该怎么做呢?哦,我只希望重定向 /~meow/。所有其他用户目录都不应更改。
答案1
您可以尝试location
像这样使用嵌套
location ~ ^/\~([^/]+)/(.*)$ {
location ~ ^/\~meow/(.*)$ {
rewrite ^(.*)$ http://meow.example.com$1 permanent;
}
[...]
}
答案2
静态位置对于您的要求来说更有效。如果您阅读以下四条规则http://wiki.nginx.org/HttpCoreModule#location,您会看到位置 ^~ 不会被正则表达式位置覆盖。您似乎还想在重定向时删除前导 /~meow。正确的方法是:
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;
将要总是产生相同的结果,并且第二次重写更有效,因为它是一个短路匹配并且已经包含了您想要捕获的内容。
答案3
正则表达式位置按照其在配置文件中的出现顺序进行检查,并使用第一个正则匹配项。这意味着,您的位置location ~ ^/\~meow/(.*)$
必须位于配置文件中的其他两个位置之上。