Перенаправление nginx geoip в первый раз приводит только к циклу перенаправления
Я пытаюсь настроить nginx для выполнения проверок geoIP только для новых посетителей.
Идея состоит в том, что впервые посетители должны быть перенаправлены на версию страницы, которая была настроена для их языка / страны.
Я могу проверить, существует ли определенный файл cookie. Если это так, то nginx может продолжить работу, а не перенаправить.
Эта настройка означает, что все новые посетители будут перенаправлены на наиболее подходящую версию страницы для своей страны / языка. И в то же время, те пользователи, которые хотят, могут свободно просматривать все версии, доступные впоследствии.
Я полагаю, что Google рекомендует этот тип настройки для многоязычных / многосайтовых веб-страниц.
Проблема в том, что я получаю цикл перенаправления, если директива перезаписи находится вне корневого расположения. Тем не менее, поскольку версия для США совпадает с версией / 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
}
1 ответ
После большого количества проб и ошибок, эта конфигурация будет работать и работать так, как ожидается.
Проблема с моей предыдущей версией была двойной:
- Nginx переписывает за пределами локаций, было грязно, и они просто отказались бы работать, создав неприятные петли
Nginx проверял наличие куки, который устанавливается 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 }