Найти тему
SСhaos

Редирект на региональный домен без php, на nginx

В данной статье продолжим (предыдущая статья данной тематики) оптимизацию обработки запросов к сайту, на примере редиректа на поддомен на основе сохраненной cookies. Коснемся работы с региональными поддоменами, хотя такая методика редиректа справедлива ни только для них. Когда пользователь попадает на сайт, ему предлагается выбрать города, с помощью geoIP можно помочь пользователю предложив вариант на основе его IP адреса.

Записав ответ в cookies, мы можем перекинуть пользователя на соответствующий региональный поддомен. Через некоторое время пользователь может вернуться на сайт, но пойти не на поддомен, а на основной. Поэтому нам нужно считать cookies и произвести редирект на региональный поддомен.

Это легко сделать с помощью php, но тогда нам придется опять загружать ядро сайта, что приведет к лишней нагрузки на сервер. Более дешевый вариант по процессору и памяти будет обработать это на стороне nginx:

# map по своей сути ассоциативный массив, который присваивает переменной $domain_host в значение на основе $cookie_BX_CITY
map $cookie_BX_CITY $domain_host {
default "site.ru";
"%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0" "moscow.site.ru"; # Москва
}
server{
...
# признак редиректа
set $dh 0;
# если текущий хост не равен полученному на основе $cookie_BX_CITY, то редирект нужен
if ($host != $domain_host) {
set $dh 1;
}
# Если $cookie_BX_CITY пуста то редирект не нужно делать
if ($cookie_BX_CITY = "") {
set $dh 2;
}
# Редирект на $domain_host, не забывая запрос который пришел текущий домен
if ($dh = 1) {
return 301 https://$domain_host$request_uri;
}
...
}

Внимание!!! Небольшое предупреждение, связанное с if, используйте данную конструкцию аккуратно, так как она может приводить не всегда к тому чего вы ожидаете, подробнее тут.

З.Ы. А еще мы пишем много полезной информации в блоге Стократ. Добро пожаловать.