Skip to content

Nginx 条件判断

在 Nginx 中,条件判断通常用于根据特定条件动态调整配置或请求处理逻辑。虽然 Nginx 的配置语言是声明式的(非通用编程语言),但仍支持一些条件判断机制。

if 指令(上下文:server, location)

  • 功能:在特定条件下修改请求或响应行为。

  • 注意:Nginx 官方文档指出 if 可能存在“意料之外的行为”,建议谨慎使用(尤其在 location 中)。

  • 示例

    nginx
    location / {
        if ($request_method = POST) {
            return 405; # 拦截 POST 请求
        }
    }

map 指令(上下文:http)

  • 功能:基于变量值映射到另一个值,类似键值对或 switch-case。

  • 示例:根据$http_user_agent设置变量:

    nginx
    map $http_user_agent $is_mobile {
        default       0;
        "~*android"   1;
        "~*iphone"    1;
    }
    
    server {
        if ($is_mobile) {
            rewrite ^ /mobile-redirect;
        }
    }

try_files 指令(上下文:server, location)

  • 功能:按顺序检查文件或路径是否存在,否则返回备用结果。

  • 示例

    nginx
    location / {
        try_files $uri $uri/ /index.html;
    }
    • $uri
      • 先检查请求的 精确路径对应的文件 是否存在(例如请求 /about,则查找 /about 这个文件)。
      • 如果文件存在,直接返回该文件;否则继续下一步。
    • $uri/
      • 检查请求的路径是否是一个 目录(例如请求 /blog/,会查找 /blog/index.html 等默认索引文件)。
      • 如果是目录且存在默认索引文件(如 index.html),返回目录内容;否则继续下一步。
    • /index.html
      • 如果前两步均未找到匹配的资源,则 返回 /index.html 作为默认响应(常见于单页应用 SPA 的路由处理)。

geo 指令(上下文:http)

  • 功能:根据客户端 IP 条件设置变量。

  • 示例

    nginx
    geo $allow_ip {
        default     0;
        192.168.1.0/24 1; # 允许内网访问
    }
    
    server {
        if ($allow_ip = 0) {
            return 403;
        }
    }

limit_except 指令(上下文:location)

  • 功能:限制特定 HTTP 方法(如只允许 GET)。

  • 示例

    nginx
    location /api {
        limit_except GET {
            deny all;
        }
    }