Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
# установили переменную $get_redirect со значением donot_redirect
set $get_redirect donot_redirect;
# в случае, если клиент заходит на главную страницу присваеваем переменной значение do_redirect
if ($uri = '/') {
set $get_redirect do_redirect;
}
# если nginx не нашел адреса клиента в базе и в переменной $region_number значение 'all' , то и редиректить незачем
if ($city = 'all') {
set $get_redirect donot_redirect;
}
# если уже есть кука, т.е. клиент уже заходил к нам и мы его редиректили на его регион (должна же быть возможность смотреть главную страницу)
if ($cookie_geolocate = 1) {
set $get_redirect donot_redirect;
}
# ну и собственно сам редирект на нужную страницу
if ($get_redirect = do_redirect) {
rewrite ^(.*)$ http://example.com/region/$region_number redirect;
}
location / {
if ($cookie_geolocate = 1) {
break;
}
if ($region_number != all) {
return http://example.com/region/$region_number;
}
}
if ($uri ...) — первый признак плохой конфигурации. То, что так можно писать, не значит, что так нужно писать. Директива location не только структурирует вашу конфигурацию, но и специально оптимизирована для поиска конфигурации по URI. Если это не регулярное выражение, то поиск будет происходить по дереву. Не нужно программировать на if-ах, количество директив модуля rewrite должно быть сведено к минимому./" или установлена кука.rewrite ^(.*)$ — просто пустая трата памяти и ресурсов процессора на бессмысленное регулярное выражение с захватом.geo $city {
default all;
# a.b.c.d region1;
# z.y.x.w region2;
}
map $cookie_geolocate $destlocation {
default redir;
0 redir;
1 all;
}
server {
root /var/www;
location @all {
# default root
}
location @redir {
rewrite / /region/$city redirect;
}
location = / {
error_page 418 = @$destlocation;
return 418;
}
location /region/all {
alias /var/www;
}
location / {
# default root
add_header Set-Cookie "geolocate=1;Path=/;";
}
}
Геотаргетинг nginx, частный случай