我正在尝试重写 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.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
我这里漏掉了什么?我的正则表达式是否已经生疏了?
编辑:这是我对该网站的完整配置,以防出现其他问题而覆盖它。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;
}