Я пытаюсь переписать 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
Но не пример. 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
В одном из блоков сервера
у вас есть блок location ~ \ .php
рядом с блоком location
, содержащим переписать операторы. Этот блок регулярного выражения
location имеет приоритет при оценке URI, которые заканчиваются на
.php`.
Один из вариантов - переместить операторы перезаписи в блок server
, в котором если они будут выполнены перед выбранным блоком местоположения
. Например:
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;
}