NGINX - Определить вышестоящий сервер из cookie - PullRequest
0 голосов
/ 09 июля 2019

Я хочу использовать значение cookie в запросе, чтобы определить, какой из вышестоящих серверов использовать.Я попробовал этот конфиг, и он работает, если значение cookie правильное, но не работает так, как я ожидал, если значение не соответствует

events {}
http {

    log_format custom '"cookies=$http_cookie;cookiename=$cookie_SESID;host=$host;scheme=$scheme;$http_host"';

    access_log /var/log/nginx/access.log custom;
    error_log /var/log/nginx/error.log;

    resolver 8.8.4.4 valid=10s;

    server {

            listen 80;
            listen 443;
            server_name _;

                    location  ~* ^/$ {

                            if ($cookie_SESID = "Value") {
                                    #proxy_pass to one of the instances (test or real)
                                    #proxy_set_header HOST $host;
                                    proxy_pass http://www.google.com;
                            }

                            #proxy_pass $scheme://$http_host;
                            proxy_pass http://amazon.com;
                    }
    }
}

Если значение cookie равно «Значение«Я хочу, чтобы оно перешло на http://www.google.com, что и происходит, но если значение cookie является чем-то другим, я ожидал, что оно перейдет на http://amazon.com, но вместо этого оно дает мне статус 301.Я знаю, что нет концепции блока else, так как бы я это сделал?Кроме того, я знаю, что, как правило, не очень хорошо использовать предложение if, но я новичок в этом, поэтому решил использовать то, что знал.Любая помощь будет принята с благодарностью.

Обновление : я также пробовал ту же логику, используя карту NGINX, но все еще не работал.

events {}
http {

    log_format custom '"cookies=$http_cookie;cookiename=$cookie_SESID;host=$host;scheme=$scheme;$http_host"';

    access_log /var/log/nginx/access.log custom;
    error_log /var/log/nginx/error.log;

    resolver 8.8.4.4 valid=10s;

    map $cookie_SESID $backend{

    default http://www.amazon.com;
    Value   http://www.google.com;

    }

    server {

            listen 80;
            listen 443;
            server_name _;

                    location  ~* ^/$ {

                            #proxy_pass $scheme://$http_host;
                            proxy_pass $backend;
                    }
    }
}

ДругойОбновление:

Директива map, кажется, работает, если я использую http://slashdot.org в качестве URL-адреса по умолчанию, это даст мне 301. Если я использую https://slashdot.org, она работает нормально.Так что если местоположение меняется, как я могу следовать за ним к новому местоположению, указанному в заголовке Location: ниже?

HTTP/1.1 301 Moved Permanently
   < Server: nginx/1.14.0 (Ubuntu)
   < Date: Tue, 09 Jul 2019 13:37:59 GMT
   < Content-Type: text/html
   < Content-Length: 194
   < Connection: keep-alive
   < Location: https://slashdot.org/
...