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通过服务器或其上游代理。
目前我正在使用 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
.
但是,对于大多数应用程序来说,非常严格的方法是行不通的,因为通常有大量资源文件(例如 *.css
、*.js
)具有也需要处理的唯一 URI通过服务器或其上游代理。