У меня небольшая проблема с прототипом конфигурации 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/;
}
# ....