Назад | Перейти на главную страницу

геотаргетинг и проксирование nginx

У меня небольшая проблема с прототипом конфигурации Nginx

Сценарий следующий: посетитель сайта зайдет на example.com. Nginx считывает текущее местоположение с помощью GeoIP и принимает языковой заголовок из браузера.

эта информация должна относиться к proxypass

Моя проблема в том, как указать Nginx использовать прокси-сервер с этими двумя переменными. С этой конфигурацией я стал ошибкой 404.

любая идея?

geoip_country   /usr/share/GeoIP/GeoIP.dat;
geoip_proxy 10.241.16.0/24; 



upstream hybrisqa {
       server qa-hybris.local:9001;
}



server {
    listen 80 default_server;
    listen [::]:80 default_server;
#   root /var/www/html;
allow all;
    access_log  /var/log/nginx/test_access.log;
    error_log  /var/log/nginx/test.error.log;



    # Add index.php to the list if you are using PHP
#   index index.html index.htm index.nginx-debian.html;

    server_name   _;

#        return 301 /$geoip_country_code;




location = / {

          rewrite_by_lua '
           if (ngx.var.http_accept_language == nil or ngx.var.http_accept_language == "") then
            ngx.redirect("/en-" .. ngx.var.geoip_country_code .. "/")
          end
          for lang in (ngx.var.http_accept_language .. ","):gmatch("([^,]*),") do
          if string.sub(lang, 0, 2) == "en" then
          ngx.redirect("/en-" .. ngx.var.geoip_country_code .. "/" )
          end
          if string.sub(lang, 0, 2) == "de" then
          ngx.redirect("/de-" .. ngx.var.geoip_country_code .. "/" )
          end
          if string.sub(lang, 0, 2) == "nl" then
          ngx.redirect("/nl-" .. ngx.var.geoip_country_code .. "/"  )
          end
          end
          ngx.redirect("/en-US/")
          ';

}


location / {

 proxy_pass http://hybrisqa;


try_files $uri $uri/ =404;


}

}

Lua слишком сложен для этого. Проще всего использовать map.

Обратите внимание, что одно малоизвестное свойство карт заключается в том, что они могут проверять сразу несколько переменных, объединяя их.

Например:

map $geoip_country_code$http_accept_language $locale {
    default en-US
    ~^DEde  de-DE
    ~^NLnl  nl-NL
    # ... continue for every supported combination of language and country
}

server {
    location = / {
        return 302 /$locale/;
    }
    # ....