Страница 1 из 1

Nginx redirect

Добавлено: 01 фев 2016, 21:33
GeekHacker
Привет!

Достался мне в наследство один сайтец.
Мне нужно прописать правила перенаправления в конфиге Nginx.
Цель: избавиться от поддоменов.
Часть запросов, приходящих на поддомены, нужно редиректить в поддиректории, а часть в корневую директорию.

Все мы знаем, что в Nginx запрещены вложенные if-условия. В противном случае проблем бы не было.
В общем, сейчас схематически набросаю то, что я хотел бы получить, если бы вложенные ifЫ были разрешены.
if ($host ~ ^([a-z]+)\.example\.com$ ) {
set $path $1;
if ($document_uri ~ ^/(file1|file2|file3)\.php$ ) {
return 301 http://example.com/$path$request_uri;
}
if ($document_uri ~ ^/id_[0-9]\.php$ ) {
return 301 http://example.com$request_uri;
}
}
Но так сделать нельзя.

Может есть идеи как одновременно сохранить логику и избежать кучи проверок, цепочек перенаправлений и прочей ереси?

Заранее благодарен всем за помощь))

Re: Nginx redirect

Добавлено: 01 фев 2016, 22:12
Oops
Для того что бы избавиться от поддоменов, нужно создать отдельный конфиг и в него прописать
server
{
        listen 80;
        server_name *.example.com; // занимаем все поддомены
        return 301 http://example.com:80$request_uri; // перенаправляем на основной домен
}

Re: Nginx redirect

Добавлено: 01 фев 2016, 22:47
GeekHacker
Это понятно.

Там же должны быть разные редиректы при разных $request_uri. И только если был запрошен поддомен.
Тут не всё так просто.
П.С. Пока решил вопрос усложнением регулярки. В принципе, решение устраивает.

Re: Nginx redirect

Добавлено: 01 фев 2016, 23:05
GeekHacker
Только теперь возникает ещё один вопрос.
Сейчас всё сводится к тому, что я проверяю $host и $document_uri одной регуляркой.
Есть ли какой-то способ передавать в if объединённое значение двух переменных?
Сейчас делаю:
set $host_and_file $host$document_uri;
if ($host_and_file ~ ^([a-z]+)\.example\.com/(?:file1|file2|file3)\.php$ ) {
...
}
А вот такое:
if ($host$document_uri ~ ^([a-z]+)\.example\.com/(?:file1|file2|file3)\.php$ ) {
...
}
Такое не работает.