【问题标题】:Block/Deny all requests that are not mapped by locations阻止/拒绝所有未按位置映射的请求
【发布时间】:2025-12-30 14:35:17
【问题描述】:

目前我正在使用 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
    }

我对这个设置的期望是,如果我请求一个像:https://dev.mydomain.xyz/aaaaaa 这样的 url,它会给我一个 404,但发生的事情是它正在解决根块(第一个 location / 块)。

出于安全和可用性的原因,我现在想要实现的是阻止/拒绝以上述方式发出的所有请求(位置块不存在/未列出)。我看到了这个问题: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,等等。

【问题讨论】:

  • 有趣,有什么方法可以使用某种正则表达式来拒绝不需要的请求。
  • 我接受的请求将是我映射的位置(例如//api/database)。问题是,这些路由中的每一个都必须代理到不同的容器。我会将此信息添加到帖子中。
  • 您的位置接受 /api 开头的 URI,正如我所说,location / 接受 / 开头的 URI(其中是其他一切)。如果您只想处理//api/database URI,请使用= 修饰符。见this document
  • 哦,我明白你的意思了,我查阅了这部分文档,但它看起来不像我想要做的。您能否发布一个正确的答案,以便我将其标记为已解决?

标签: http nginx https reverse-proxy nginx-reverse-proxy


【解决方案1】:

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 返回“禁止”状态代码。

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

【讨论】:

  • TY 再次寻求答案。
最近更新 更多