Блокировать / отклонять все запросы, которые не сопоставлены по местоположениям - PullRequest
1 голос
/ 16 января 2020

В настоящее время я использую nginx в качестве прокси-сервера для нескольких docker контейнеров, работающих на разных хостах.

Каждый контейнер или пара контейнеров отображаются с помощью блока местоположения в файле виртуальных хостов, как это dev.conf:

server {
    server_name dev.mydomain.xyz

    location / {
        proxy_pass http://172.16.18.2:8080/dashboard
        proxy_buffering off;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location /api {
        proxy_pass http://172.16.18.2:5000/api
        proxy_buffering off;
        proxy_set_header X-Real-IP $remote_addr;
    }
    ...
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/dev.mydomain.xyz/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/dev.mydomain.xyz/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

}

server {

    if ($host = dev.mydomain.xyz) {

        return 301 https://$host$request_uri;
        } # managed by Certbot

        server_name dev.mydomain.xyz;
        listen 80;
        return 404; # managed by Certbot
    }

Что бы я ожидал от этой настройки, так это то, что если бы я запросил URL-адрес типа: https://dev.mydomain.xyz/aaaaaa, это дало бы мне 404, но вместо этого происходит то, что это решение для блока root (первый блок location /).

Чего я хочу достичь сейчас, из соображений безопасности и удобства использования - это блокировать / отклонять все запросы, которые были сделаны вышеупомянутым способом (местоположение блок отсутствует / не указан). Я видел этот вопрос: о похожей проблеме , но это не сработало, как я ожидал. Имейте в виду, что я использую несколько файлов виртуальных хостов, все они включены в nginx.conf.

Пример:

Request to dev.mydomain.xyz/api is allowed and processed
Request to dev.mydomain.xyz/nothing is denied

Nginx - это версия nginx/1.14.2, установленная в Debian 10 x64 бит. Дайте мне знать, если потребуется дополнительная информация. Заранее спасибо.

РЕДАКТИРОВАТЬ 1 Для ясности, под желаемыми запросами я имел в виду местоположение, которое я назначил для данного виртуального хоста (это конечные точки), из которых каждое из этих мест должно быть Прокси для другого контейнера. Например, запросы на / должны go на container1, запросы на /api должны go на container2 и т. Д. c.

1 Ответ

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

Блок location / { ... } является местоположением по умолчанию и используется для обработки любых запросов, которые не соответствуют другим более конкретным инструкциям c location. Правила location обработки задокументированы здесь .

Блок location /api { ... } является префиксом , который соответствует любому URI, который начинается с /api.

Если вы хотите использовать только прокси укажите c URI / и /api, затем используйте директиву location с оператором =. Например:

location / {
    return 403;
}
location = / {
    # proxy for only /
}
location = /api {
    # proxy for only /api
}

Выше приведен код состояния «Запрещено» для любого URI, кроме / и /api.

Однако очень строгий подход не будет работать для в большинстве приложений, поскольку обычно имеется несколько файлов ресурсов (например, *.css, *.js) с уникальными URI, которые также должны обрабатываться сервером или его прокси-серверами восходящего потока.

...