Nginx重写子文件夹到一个子域,并保持一切

我正在尝试重写url来处理以下情况,我想redirect几个特定的​​子文件夹到一些特定的子域,并保留子文件夹后的任何东西。

到目前为止我有:

location / { rewrite ^/sub1/?(.*)$ https://sub1.example.com/$1 permanent; rewrite ^/sub2/?(.*)$ https://sub2.example.com/$1 permanent; rewrite ^/sub3/?(.*)$ https://sub3.example.com/$1 permanent; rewrite ^/sub4/?(.*)$ https://sub4.example.com/$1 permanent; } 

这将处理example.com/sub1 example.com/sub1/ example.com/sub1/foobar
但不是example.com/sub1/page.php这是去example.com/sub1/page.php和404的原因它不存在。

我想要
example.com/sub1转到sub1.example.com
example.com/sub1/转到sub1.example.com/
example.com/sub1/foobar转到sub1.example.com/foobar
example.com/sub1/foo/bar/进入sub1.example.com/foo/bar/
example.com/sub1/page.php转到sub1.example.com/page.php

我在这里错过了什么? 我的正则expression式是生锈的吗?

编辑:这是我的整个configuration为该网站,万一它的一个问题与其他覆盖它的东西。 https://pastebin.com/sEka1Q0e

在其中一个server块中, location包含rewrite statements. That regular expressionlocation块旁边有一个location ~ \.phprewrite statements. That regular expression block takes precedence when evaluating URIs which end with .php block takes precedence when evaluating URIs which end with rewrite statements. That regular expression位置block takes precedence when evaluating URIs which end with

一种select是将重写语句移入server块,在这种情况下,它们将在select任何location之前执行。 例如:

 server { ... rewrite ^/sub1/?(.*)$ https://sub1.example.com/$1 permanent; rewrite ^/sub2/?(.*)$ https://sub2.example.com/$1 permanent; rewrite ^/sub3/?(.*)$ https://sub3.example.com/$1 permanent; rewrite ^/sub4/?(.*)$ https://sub4.example.com/$1 permanent; location / { } location ~ \.php$ { ... } ... } 

或者,更有效的解决scheme是将重写语句放在单独的前缀位置中,但是使用^~修饰符给予它们更高的优先级。 详情请参阅此文件 。

 location ^~ /sub1 { rewrite ^/sub1/?(.*)$ https://sub1.example.com/$1 permanent; } location ^~ /sub2 { rewrite ^/sub2/?(.*)$ https://sub2.example.com/$1 permanent; } location ^~ /sub3 { rewrite ^/sub3/?(.*)$ https://sub3.example.com/$1 permanent; } location ^~ /sub4 { rewrite ^/sub4/?(.*)$ https://sub4.example.com/$1 permanent; }