Я пытаюсь настроить nginx для выполнения проверок гео-IP только для новых посетителей.
Идея состоит в том, что впервые посетители должны быть перенаправлены на версию страницы, настроенную для их языка / страны.
Я могу проверить, существует ли определенный файл cookie. Если это так, то nginx может продолжить работу без перенаправления.
Такая настройка означает, что все новые посетители будут перенаправлены на версию страницы, наиболее подходящую для их страны / языка. И в то же время те пользователи, которые желают, могут по-прежнему свободно просматривать все доступные впоследствии версии.
Я считаю, что Google рекомендует этот тип настройки и для многоязычных / многосайтовых веб-страниц.
Проблема в том, что я получаю цикл перенаправления, если директива rewrite размещается вне корневого местоположения. Тем не менее, поскольку версия для США такая же, как / root, перезапись внутри местоположений оказалась еще более сложной для настройки.
Значения geo_IP передаются нормально через fastcgi на php, если перезапись не указана, поэтому я не думаю, что с настройкой что-то не так, кроме самой перезаписи.
Это мой конфиг:
map $geoip2_data_country_code $country_url {
default example.com; ##This is the US version
GB example.com/uk;
CA example.com/ca;
}
server {
listen 443 ssl spdy default_server;
server_name example.com;
root /var/www/html;
if ($http_cookie !~ "cookie_to_check") {
rewrite ^ https://$country_url break;
#Appending $request_uri to the rewrite yields very similar results
}
location / {
try_files $uri $uri/ /index.php?$args;
}
location /uk {
try_files $uri $uri/ /uk/index.php?$args;
}
location /ca {
try_files $uri $uri/ /ca/index.php?$args;
}
##Other locations
}
После множества проб и ошибок эта конфигурация будет работать и работать так, как ожидалось.
Проблема с моей предыдущей версией была двойной:
Nginx проверял наличие файла cookie, установленного приложением php за nginx. Спасибо @AlexeyTen за указание на это. Условная установка дополнительного файла cookie с помощью nginx сделала свое дело
map $geoip2_data_country_code $country_url {
default example.com; ##This is the US version
GB example.com/uk;
CA example.com/ca;
}
server {
listen 443 ssl spdy default_server;
server_name example.com;
root /var/www/html;
location / {
try_files $uri $uri/ /index.php?$args;
if ($http_cookie !~ "country=set") {
add_header Set-Cookie "country=set;Max-Age=31536000";
rewrite ^ $scheme://$country_url$request_uri break;
}
}
location /uk {
try_files $uri $uri/ /uk/index.php?$args;
if ($http_cookie !~ "country=set") {
add_header Set-Cookie "country=set;Max-Age=31536000";
rewrite ^ $scheme://$country_url$request_uri break;
}
}
location /ca {
try_files $uri $uri/ /ca/index.php?$args;
if ($http_cookie !~ "country=set") {
add_header Set-Cookie "country=set;Max-Age=31536000";
rewrite ^ $scheme://$country_url$request_uri break;
}
}
##Other locations
}