nginx:将子文件夹重定向到子域名

nginx:将子文件夹重定向到子域名

我正在尝试将子文件夹重定向到 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/(.*)$必须位于配置文件中的其他两个位置之上。

相关内容