【发布时间】: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和/databaseURI,请使用=修饰符。见this document。 -
哦,我明白你的意思了,我查阅了这部分文档,但它看起来不像我想要做的。您能否发布一个正确的答案,以便我将其标记为已解决?
标签: http nginx https reverse-proxy nginx-reverse-proxy