Block/Deny 所有未按位置映射的请求

Block/Deny all requests that are not mapped by locations

目前我正在使用 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,但实际发生的是它正在解决根问题块(第一个 location / 块)。

出于安全性和可用性原因,我现在想要实现的是 block/deny 以上述方式发出的所有请求(已列出位置块 nonexistent/not)。我看到了这个问题:about a similar issue,但这并没有像我预期的那样工作。请记住,我正在使用多个虚拟主机文件,所有文件都包含在 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 明确地说,通缉请求是指我为给定虚拟主机(它的端点)映射的位置,其中每个位置都必须为不同的容器代理。就像,对 / 的请求必须转到 container1,对 /api 的请求必须转到 container2,等等

location / { ... } 块是默认位置,用于处理与任何其他更具体的 location 语句不匹配的任何请求。 location 处理的规则是 documented here

location /api { ... } 块是一个 前缀位置 ,匹配任何 /api 开头的 URI。

如果您只想代理特定的 URI //api,请使用带有 = 运算符的 location 指令。例如:

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

以上将为除 //api.

之外的任何 URI return 一个 "Forbidden" 状态码

但是,对于大多数应用程序来说,非常严格的方法是行不通的,因为通常有大量资源文件(例如 *.css*.js)具有也需要处理的唯一 URI通过服务器或其上游代理。