условная маршрутизация с nginx на основе реферера - PullRequest
0 голосов
/ 11 декабря 2018

Мне нужно маршрутизировать трафик на основе источника http-запроса.У меня есть две среды, и нам нужно перенаправить каждый http-запрос для "/ us-en" в Environment1 и другие в Environment2, используя "$ http_referer".

  1. Перенаправление на основе определения местоположения.
location ~ /us-en { 
    proxy_pass Environment1; 
    proxy_set_header Host Environment1; 
} 
При использовании $ http_referer нижеследующая опция не работает.Запросите ваше предложение на то же самое.
if ($http_referer ~ ^https?://dev.xyz.com/us-en){ 
    rewrite ^/us-en(/*)$ HOME_PAGE$1 break; 
    proxy_pass Environment1; 
}
Error: nginx: [emerg] "proxy_pass" directive is not allowed here in /opt/nginx/conf/nginx.conf.

Примечание. По умолчанию весь трафик направляется в Environment2 при наличии конфигурации восходящего потока.

1 Ответ

0 голосов
/ 11 декабря 2018
    # needed if your proxy destination specified with domain name instead of IP address
    resolver 8.8.8.8;

    location /home/ {
        proxy_set_header Host HOST1;
        # setup other proxied headers if needed
        if ($http_referer ~ ^https?://dev.xyz.com/home) {
            rewrite ^/home(/.*)$ HOME_PAGE$1 break;
            proxy_pass https://HOST1:8080; # this can be specified by IP address
        }
    }

При таких настройках запросы на your_domain.com/home/path/file от dev.xyz.com/home/... (но не от dev.xyz.com/any/other/path!) Будут проксироваться до https://HOST1:8080/HOME_PAGE/path/file.Если вы указываете адрес прокси-сервера с именем домена вместо IP-адреса, вам потребуется указать дополнительный параметр resolver в конфигурации вашего сервера.Вы можете использовать свой локальный сервер имен, если он у вас есть, или использовать что-то внешнее, например, общедоступный DNS Google (8.8.8.8) или DNS, предоставленный вам вашим провайдером.В любом случае такая конфигурация приводит к дополнительным поискам DNS, поэтому, если вы можете, укажите адрес прокси-сервера с IP-адресом.

Обновление

Есть еще один способ сделать это с помощьюvalid_referers директива:

    # needed if your proxy destination specified with domain name instead of IP address
    resolver 8.8.8.8;

    location /home/ {
        proxy_set_header Host HOST1;
        # setup other proxied headers if needed
        valid_referers example.com/home;
        if ($invalid_referer = "") {
            rewrite ^/home(/.*)$ HOME_PAGE$1 break;
            proxy_pass https://HOST1:8080; # this can be specified by IP address
        }
    }
...