V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
ab
V2EX  ›  NGINX

请教 nginx deny 优先级的问题。

  •  
  •   ab · 113 天前 · 2067 次点击
    这是一个创建于 113 天前的主题,其中的信息可能已经有所发展或是发生改变。

    http{ deny 192.168.6.8; ... server { listen 443 ssl; http2 on; server_name example.com; ... if ($http_user_agent ~* "curl") { return 406; } } } 客户端 192.168.6.8 使用 curl -I example.com 时,返回 406 ,难道 if 比 http 段的 deny ip 的优先级还高吗?

    9 条回复    2024-09-01 12:33:48 +08:00
    gesse
        1
    gesse  
       113 天前
    ```
    http{
    deny 192.168.6.8;
    server {
    listen 443 ssl;
    http2 on;
    server_name example.com;
    if ($http_user_agent ~* "curl") {
    return 406;
    }
    }
    }
    ```
    - deny 指令 会拒绝访问并返回 403 状态码,但它不会停止后续配置的解析。
    - if 语句 仍然会被执行,并可能修改或覆盖之前的响应状态。
    GeekGao
        2
    GeekGao  
       113 天前
    当客户端( 192.168.6.8 )发起请求时,首先检查的是 http 块中的 deny 指令。
    如果 IP 地址被允许访问,则继续处理请求。
    请求进入 server 块,在这里执行 if ($http_user_agent ~* "curl") 条件。这个条件是在请求处理过程中动态评估的,而不是在初始连接阶段。
    因为 $http_user_agent 变量是基于实际请求头生成的,所以它可以覆盖之前的 deny 指令。

    如果想完全阻止特定 IP 地址的访问,无论其 UA 如何,你可以考虑在 server 块中使用 if ($remote_addr = 192.168.6.8) 条件。
    GeekGao
        3
    GeekGao  
       113 天前
    所以,盲猜应该是 if 指令优先级的问题
    ab
        4
    ab  
    OP
       113 天前
    @GeekGao
    @gesse

    谢谢两位大佬,目前还是不能确定,文档翻了半天也没看到优先级的说明。chatgpt 和 gemini 则都是一口咬定 http 的 deny 优先,正常应该返回 403
    ladypxy
        5
    ladypxy  
       113 天前 via iPhone
    你这就最常见的配置错误啊,官方文档就专门有一段,搜索 nginx if is evil

    https://github.com/nginxinc/nginx-wiki/blob/836ecd605a1b9861fb608e848336bca9b8640b54/source/start/topics/depth/ifisevil.rst
    ab
        6
    ab  
    OP
       112 天前
    @ladypxy 原来如此,谢谢!
    gesse
        7
    gesse  
       112 天前
    @ladypxy
    这个文章貌似是说 if 在 location 里的问题,OP 的设置并没有在 location 里。
    ab
        8
    ab  
    OP
       111 天前
    @gesse 其实是一样的,一个 if 相当于一个 location
    usernametoolong
        9
    usernametoolong  
       111 天前
    if 加一个 break ?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1117 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 18:39 · PVG 02:39 · LAX 10:39 · JFK 13:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.