nginx中deny和allow详解

本文介绍了Nginx配置中deny和allow的使用规则,它们用于控制HTTP请求的访问权限。deny和allow按照顺序匹配,一旦匹配到deny,则返回403Forbidden错误。若IP未被明确deny或allow,默许允许访问。在嵌套配置中,更具体的allow或deny优先级更高,覆盖外层规则。

deny和allow都是在access阶段
allow和deny都可以在http,server,location,limit_except中使用
如果被deny则会返回“403 Forbidden”报错信息
以下几个场景能够说明清楚这2个命令的具体是怎么用的

location / {
    deny  192.168.1.1;     #支持单个IP
    allow 192.168.1.0/24;  #支持一个网段
    allow 2001:0db8::/32;  #支持ipv6
    deny all;   #支持all匹配到所有
}

# 问:192.168.1.1 匹配到了上面的第1,2,4行,请问该ip是deny还是allow?
# 答:deny和allow是顺序匹配,匹配到即停止。所以第一条匹配到后,就直接deny了


server {
    allow 10.0.9.14;
    listen 8813;
    location / {
        deny 10.0.9.14;
    }
}
#问:10.0.9.14在server中allow和locaton中deny都匹配到,到底是哪个生效?
#答:deny生效。参考变量的生效规则。


#问:如果一个ip没有被deny也没被allow,则怎么处理?
#答:allow


http {
    deny all;
    server {
        allow 10.0.9.14;
        listen 8813;
        location / {
        }
    }
}
#问,除了10.0.9.14,其它的ip是否能够访问?
#答,可以。因为server中已经有了allow或deny指令,所以http中的不生效。没写allow和deny的ip默认是allow


http {
    deny all;
    server {
        listen 8813;
        location / {
        }
    }
}
#问:所有ip能否访问?
#答:不能,因为http中的deny all生效了。

Nginx 配置文件中,`server` 块是非常关键的部分,用于定义虚拟主机,一个 `server` 块代表一个虚拟主机,可在一台 Nginx 服务器上通过不同配置处理多个域名或者基于不同端口的服务请求[^2]。以下是对 `server` 配置的详细说明: ### 基本结构 ```nginx server { listen 80; server_name example.com; location / { root /var/www/html/example; index index.html index.htm; } } ``` ### 常用配置指令 #### 监听端口(listen) `listen` 指令用于指定 Nginx 监听的 IP 地址端口。如果只指定端口,Nginx 将监听所有可用的 IP 地址。 ```nginx server { listen 80; # 监听所有 IP 地址的 80 端口 listen 192.168.1.100:8080; # 监听指定 IP 地址的 8080 端口 } ``` #### 域名绑定(server_name) `server_name` 用于将特定的域名服务器上的服务关联起来,当用户通过浏览器访问该域名时,Nginx 能够准确地将请求路由到对应的服务上,是实现多域名网站托管的基础。它支持精确匹配、通配符匹配、正则表达式匹配等多种配置方式[^1][^2]。 ```nginx server { listen 80; server_name example.com; # 精确匹配 server_name *.example.com; # 通配符匹配,匹配所有以 example.com 结尾的域名 server_name ~^www\d+\.example\.com$; # 正则表达式匹配,匹配以 www 开头,后面跟数字的域名 } ``` #### 字符编码(charset) `charset` 指令用于设置响应的字符编码,防止显示中文乱码等问题。 ```nginx server { listen 80; server_name 172.16.31.218; charset 'utf-8'; # 设置字符编码为 UTF-8 } ``` #### 访问日志(access_log) `access_log` 指令用于控制是否记录访问日志。 ```nginx server { listen 80; access_log off; # 匹配到该 server 时,不记录日志 } ``` #### 返回状态码(return) `return` 指令用于直接返回指定的 HTTP 状态码响应内容。 ```nginx server { listen 80; return 444; # 返回码为 444 } ``` #### 位置匹配(location) `location` 指令用于匹配不同的 URL 路径,并对匹配的请求进行相应的处理。 ```nginx server { listen 80; server_name example.com; location / { root /var/www/html/example; # 设置网站根目录 index index.html index.htm; # 设置默认索引文件 } location /test { deny 192.168.1.0/24; # 拒绝某个网段访问 deny 10.1.1.2; # 拒绝单个 IP 访问 allow all; # 允许所有访问 proxy_pass http://127.0.0.1:8080; # 反向代理到指定地址 } } ``` ### 配置示例 ```nginx server { listen 80; server_name example.com; charset 'utf-8'; access_log /var/log/nginx/example.access.log; location / { root /var/www/html/example; index index.html index.htm; } location /api { proxy_pass http://backend_server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值