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

mrm*_*rm8 5 nginx directory redirect subdomain

我正在尝试将子文件夹重定向到 nginx 中的子域。我希望http://example.com/~meow/被重定向到http://meow.example.com/。我尝试了以下方法:

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

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

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

and

location ~ ^/\~([^/]+)/(.*)$ {
    [...]
}
Run Code Online (Sandbox Code Playgroud)

那么,我该怎么做呢?哦,我只想 /~meow/ 被重定向。不应更改所有其他用户目录。

kol*_*ack 6

对于您的要求,静态位置会更有效。如果您阅读http://wiki.nginx.org/HttpCoreModule#location 上的四个规则,您将看到 ^~ 位置不会被正则表达式位置覆盖。您似乎还想在重定向时去除前导 /~meow。正确的做法是:

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

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

rewrite ^(.*)$ http://meow.example.com$1 permanent;
Run Code Online (Sandbox Code Playgroud)

rewrite ^ http://meow.example.com$uri permanent;
Run Code Online (Sandbox Code Playgroud)

始终产生相同的结果,第二次重写效率更高,因为它是一个短路匹配,并且已经包含您无论如何要捕获的内容。


Ale*_*exD 4

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

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