插件窝 干货文章 Nginx反向代理中基于URI的ACL配置

Nginx反向代理中基于URI的ACL配置

server location 访问 URI 471    来源:    2025-04-20

Nginx反向代理中基于URI的ACL配置

在Nginx中配置基于URI的访问控制列表(ACL)可以实现精细化的反向代理控制。以下是几种常见的实现方式:

1. 使用location指令进行基础URI匹配

server {
    listen 80;
    server_name example.com;

    # 允许访问的URI路径
    location /public/ {
        proxy_pass http://backend_server;
    }

    # 禁止访问的URI路径
    location /private/ {
        return 403;
    }

    # 其他路径默认处理
    location / {
        proxy_pass http://backend_server;
    }
}

2. 使用正则表达式匹配复杂URI模式

server {
    listen 80;
    server_name example.com;

    # 允许访问特定模式的URI
    location ~ ^/(images|css|js)/ {
        proxy_pass http://backend_server;
    }

    # 禁止访问包含敏感关键词的URI
    location ~* /(admin|config|backup) {
        return 403;
    }
}

3. 结合map指令实现更灵活的ACL

map $uri $is_allowed {
    default         1;
    ~^/admin        0;
    ~^/private      0;
    ~^/config       0;
}

server {
    listen 80;
    server_name example.com;

    location / {
        if ($is_allowed = 0) {
            return 403;
        }
        proxy_pass http://backend_server;
    }
}

4. 基于URI参数的条件控制

server {
    listen 80;
    server_name example.com;

    location / {
        # 检查URI参数
        if ($args ~* "token=([^&]+)") {
            set $token $1;
            # 这里可以添加token验证逻辑
        }

        # 没有token的访问
        if ($args !~* "token=") {
            return 403;
        }

        proxy_pass http://backend_server;
    }
}

5. 结合GeoIP模块的URI访问控制

geo $allowed_uri {
    default         0;
    192.168.1.0/24  1;
}

server {
    listen 80;
    server_name example.com;

    location /restricted/ {
        if ($allowed_uri = 0) {
            return 403;
        }
        proxy_pass http://backend_server;
    }
}

最佳实践建议

  1. 安全性:对于敏感路径,考虑结合认证机制(如HTTP Basic Auth)
  2. 性能:简单的字符串匹配比正则表达式更高效
  3. 可维护性:将复杂的ACL规则分离到单独的文件中
  4. 日志记录:记录被拒绝的访问以便审计
# 示例:记录被拒绝的访问
log_format acl_log '$remote_addr - $remote_user [$time_local] '
                   '"$request" $status $body_bytes_sent '
                   '"$http_referer" "$http_user_agent" $is_allowed';

server {
    access_log /var/log/nginx/acl.log acl_log;
    # ...其他配置...
}

通过以上方法,您可以灵活地实现基于URI的反向代理访问控制,满足不同场景下的安全需求。