Nginx 将子文件夹重写为子域并保留其后的所有内容

Nginx 将子文件夹重写为子域并保留其后的所有内容

我正在尝试重写 url 来处理以下情况,我想将几​​个特定的​​子文件夹重定向到几个特定的​​子域,并保留子文件夹之后的所有内容。

到目前为止我已经:

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.php404 因为它不存在。

我想去
example.com/sub1去去去去去去去sub1.example.com
example.com/sub1/sub1.example.com/
example.com/sub1/foobarsub1.example.com/foobar
example.com/sub1/foo/bar/sub1.example.com/foo/bar/
example.com/sub1/page.phpsub1.example.com/page.php

我这里漏掉了什么?我的正则表达式是否已经生疏了?

编辑:这是我对该网站的完整配置,以防出现其他问题而覆盖它。https://pastebin.com/sEka1Q0e

答案1

在您的一个server块中,您有一个location ~ \.php块与location包含rewrite statements. That regular expression位置block takes precedence when evaluating URIs which end with.php` 的块并排。

一种选择是将重写语句移到server块中,在这种情况下它们将被执行任何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$ 
    { 
        ... 
    }
    ...
}

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

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;
}

相关内容