如题,遇到的一个奇葩的需求(btw:公司最近奇奇怪怪的需求越来越多);
假设 192.168.10.10 是内网ip ,192.168.8.8是外网ip要求比如当用户在浏览器的地址栏输入
https://192.168.8.8
这个地址时不能访问nginx服务;当用户输入
https://192.168.8.8/path1
https://192.168.10.10/path1
https://192.168.10.10
地址时可以正常访问;也就是说在外网环境只允许用户访问
https://192.168.8.8/path1
这个路径下的服务
在内网的环境允许访问
https://192.168.10.10/path1
https://192.168.10.10
注意这不是nginx请求黑名单那个概念,请求黑名单是根据请求电脑的本机ip来进行限制,配置参考:nginx黑名单配置
实现思路
1. 在nginx配置文件里定义一个变量,来设置禁用的地址:
# 自定义$my_blocked_host黑名单列表
map $http_host $my_blocked_host {
default "";
"192.168.8.8" 1;
# "192.168.8.9" 1; 这里可以配置多个host黑名单地址
}
解释下上面这段配置的含义,$http_host
变量是 nginx 根据请求信息头信息中获取的host变量,$my_blocked_host
就是我花括号内的自定义map,当我的$my_blocked_host
中存在$http_host
变量的key值时返回1, 浏览器f12可查看请求头中的host
,当然了这个host
是根据请求用户的信息来获取的不一定准确,但是目前满足我们的业务需求,如下图:
2. nginx转发路径上进行判断
当转发 https:xx.xx.xx.xx/
路径的请求时会判断host,如果host在黑名单里则返回403禁止访问;
而当转发 https:xx.xx.xx.xx/path1
路径的请求时则不会有访问限制;配置如下:
server {
listen 443 ssl;
ssl_certificate CA/server.crt;
ssl_certificate_key CA/server.key;
location / {
# 检查http请求的host是否在黑名单列表中
if ($my_blocked_host) {
return 403;
}
alias /etc/nginx/html/dist/;
index index.html;
try_files $uri $uri/ /index.html;
}
location /path1 {
alias /etc/nginx/html/dist2/;
index index2.html;
try_files $uri $uri/ /index2.html;
}
}
3. 完整配置如下
定义http host黑名单列表
# 自定义$my_blocked_host黑名单列表
map $http_host $my_blocked_host {
default "";
}
server {
listen 443 ssl;
ssl_certificate CA/server.crt;
ssl_certificate_key CA/server.key;
location / {
# 检查http请求的host是否在黑名单列表中
if ($my_blocked_host) {
return 403;
}
alias /etc/nginx/html/dist/;
index index.html;
try_files $uri $uri/ /index.html;
}
location /path1 {
alias /etc/nginx/html/dist2/;
index index2.html;
try_files $uri $uri/ /index2.html;
}
}