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

Как я могу добавить несколько условий к условному блоку местоположения в конфигурации NGINX или иным образом получить тот же желаемый результат?

Первоначальное раскрытие:

Я новичок в nginx и изо всех сил пытаюсь понять принципы его настройки; Я прочитал изрядное количество документов (включая «If Is Evil»), но все еще не понимаю многих аспектов. Я намереваюсь реализовать шлюз api в ближайшем будущем для производства, но хочу реализовать описанные ниже элементы управления в прямой конфигурации nginx, если это возможно, на этапе тестирования.

Ситуация:

У меня есть служба, работающая за обратным прокси-сервером nginx в конечной точке https://foobar.org/foo/.
Я хочу запретить все неаутентифицированные запросы к прокси-серверу Кроме для одной конкретной конечной точки; давай назовем это /foo/anon_permitted

Проблема:

Я попытался добавить И к условному условию в блоке местоположения, например:

`if ($http_authorization = "" && $request != https://foobar.org/foo/anon_permitted) { return 403; }`

Однако nginx блокируется с ошибкой «недопустимое условие». [Примечание. Я пробовал различные варианты форматирования, указанные выше, но безрезультатно]

Я пробовал другие доступные переменные ($request_url, $uri, $args) из https://nginx.org/en/docs/varindex.html , но результат тот же.

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

Вопрос:

Есть ли способ добиться желаемого результата, т.е. вернуть 403 если условие 'а' и не условие 'b', используя чистую конфигурацию nginx? И если да, то как?

Текущая (рабочая, за исключением желаемого условного) конфигурация nginx, показанная ниже для справки:

    server {
      server_name foobar.org www.foobar.org;
      root /usr/share/nginx/html;
      index index.html;
      try_files $uri /index.html;
  
      listen [::]:443 ssl ipv6only=on; # managed by Certbot
      listen 443 ssl; # managed by Certbot
      ssl_certificate /etc/letsencrypt/live/foobar.org/fullchain.pem; # managed by Certbot
      ssl_certificate_key /etc/letsencrypt/live/foobar.org/privkey.pem; # managed by Certbot
      include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
      ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
  
    location /foo/ {
        default_type application/json;
        proxy_hide_header Content-Location;
        add_header Content-Location /api/$upstream_http_content_location;
        proxy_set_header Connection "";
        proxy_http_version 1.1;
        if ($http_authorization = "") { return 403; }
        proxy_pass http://foo_upstream/;
    }
  }

Вам не нужно проверять запрошенный URI с помощью if заявление. Просто создайте еще один location заблокировать и скопировать необходимые операторы.

Например:

location /foo/ {
    ...
    if ($http_authorization = "") { return 403; }
    proxy_pass http://foo_upstream/;
}
location /foo/anon_permitted {
    ...
    proxy_pass http://foo_upstream/anon_permitted;
}