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
Но не пример. 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

2
задан 10 November 2017 в 17:54
1 ответ

В одном из блоков сервера у вас есть блок 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;
}
1
ответ дан 3 December 2019 в 12:34

Теги

Похожие вопросы