Я новичок в 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;
}