Условно отображать значения в nginx config - PullRequest
1 голос
/ 09 января 2020

У меня есть сценарий, в котором я хочу proxy_pass запросов к одному из нескольких мест назначения в восходящем направлении на основе значения, которое может появиться в заголовке или в качестве параметра запроса.

Прямо сейчас у меня есть отображение на основе заголовка, в основном выясненное:

map $http_x_destination $destination {
    default     upstream0;
    something   upstream1;
    something2  upstream1;
    something3  upstream2;
}
...

server {
    location / {
        proxy_pass https://$destination;
    }
}

Очевидно, что это хорошо работает для случаев, когда у нас есть заголовок, но не для тех случаев где цель основана на операции. Моим первоначальным инстинктом было бы использовать некий условный лог c, чтобы увидеть, присутствует ли заголовок, и построить карту на основе $http_x_target, если он есть, или $arg_target вместо этого.

Но я читал множество призывов не использовать if, поскольку это считается опасным, и, поскольку я не знаю, как nginx вообще обрабатывает определения определений (не говоря уже о if блоков), я с подозрением отношусь к такому подходу.

Есть ли хороший способ объединить эти два источника информации для точного сопоставления их значений с восходящими потоками?

1 Ответ

1 голос
/ 10 января 2020

Если вы хотите отобразить $http_x_target first и $arg_target second, есть несколько решений.

Вы можете создать сложное строковое значение, например "$http_x_target:$arg_target", и использовать регулярные выражения для проверки каждой стороны. разделяющего символа.

Например:

map "$http_x_target:$arg_target" $destination {
    default      upstream0;
    ~something   upstream1;
    ~something2  upstream1;
    ~something3  upstream2;
}
...
server {
    location / {
        proxy_pass https://$destination;
    }
}

Вы можете использовать регулярные выражения, такие как ~^something: и ~:something$, чтобы проверить каждую сторону : в строке.


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

Например:

map $arg_target $arg_destination {
    default     upstream0;
    something   upstream1;
    something2  upstream1;
    something3  upstream2;
}
map $http_x_target $destination {
    default     $arg_destination;
    something   upstream1;
    something2  upstream1;
    something3  upstream2;
}
...
server {
    location / {
        proxy_pass https://$destination;
    }
}

Две карты должны управлять разными имена переменных (например, $destination и $arg_destination).

Подробнее см. в этом документе .

...