Перенаправление 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
        }
    
Другие вопросы по тегам