请教 nginx deny 优先级的问题。

ab · 2024-8-30 14:57:12 · 105 次点击
http{
    deny    192.168.6.8;
    ...
    serfer {
        listen 443 ssl;
        http2 on;
        serfer_name example.com;
        ...
        if ($http_user_agent ~* "curl") {
            return 406;
        }
    }
}
客户端 192.168.6.8 使用 curl -I example.com 时,返回 406 ,难道 if 比 http 段的 deny ip 的优先级还高吗?
举报· 105 次点击
登录 注册 站外分享
4 条回复  
gesse 小成 2024-8-30 17:31:21
```
http{
        deny 192.168.6.8;
        serfer {
                listen 443 ssl;
                http2 on;
                serfer_name example.com;
                if ($http_user_agent ~* "curl") {
                        return 406;
                }
        }
}
```
- deny 指令 会拒绝访问并返回 403 状态码,但它不会停止后续配置的解析。  
- if 语句 仍然会被执行,并可能修改或覆盖之前的响应状态。
GeekGao 小成 2024-8-30 20:40:13
当客户端( 192.168.6.8 )发起请求时,首先检查的是 http 块中的 deny 指令。
如果 IP 地址被允许访问,则继续处理请求。
请求进入 serfer 块,在这里执行 if ($http_user_agent ~* "curl") 条件。这个条件是在请求处理过程中动态评估的,而不是在初始连接阶段。
因为 $http_user_agent 变量是基于实际请求头生成的,所以它可以覆盖之前的 deny 指令。

如果想完全阻止特定 IP 地址的访问,无论其 UA 如何,你可以考虑在 serfer 块中使用 if ($remote_addr = 192.168.6.8) 条件。
ladypxy 小成 2024-8-30 23:27:51
你这就最常见的配置错误啊,官方文档就专门有一段,搜索 nginx if is evil

https://github.com/nginxinc/nginx-wiki/blob/836ecd605a1b9861fb608e848336bca9b8640b54/source/start/topics/depth/ifisevil.rst
usernametoolong 小成 2024-9-1 12:33:48
if 加一个 break ?
返回顶部