插件窝 干货文章 Nginx反向代理中基于正则表达式的访问控制配置

Nginx反向代理中基于正则表达式的访问控制配置

正则 Nginx 表达式 location 663    来源:    2025-04-20

Nginx反向代理中基于正则表达式的访问控制配置

在Nginx反向代理配置中,使用正则表达式可以实现灵活的访问控制。以下是详细的配置方法和示例:

1. 基本正则表达式匹配

Nginx使用PCRE(Perl Compatible Regular Expressions)正则表达式语法:

location ~ ^/admin/.*$ {
    deny all;
    return 403;
}

这个配置会阻止所有以/admin/开头的URL访问。

2. 常见访问控制场景

2.1 限制特定IP访问

location ~ ^/secure/ {
    allow 192.168.1.0/24;
    allow 10.0.0.1;
    deny all;
}

2.2 阻止特定User-Agent

location / {
    if ($http_user_agent ~* (wget|curl|python|java)) {
        return 403;
    }
    proxy_pass http://backend;
}

2.3 限制文件类型访问

location ~* \.(php|asp|aspx|jsp)$ {
    deny all;
    return 403;
}

3. 高级正则表达式应用

3.1 多条件组合

location ~* ^/(admin|config|private)/.*\.(php|inc|conf)$ {
    satisfy any;
    allow 192.168.1.100;
    deny all;

    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

3.2 基于Referer的限制

location /downloads/ {
    if ($http_referer !~* ^https?://(www\.)?example\.com/) {
        return 403;
    }
    proxy_pass http://downloads_backend;
}

4. 在反向代理中的典型应用

server {
    listen 80;
    server_name proxy.example.com;

    # 阻止扫描工具
    location ~* (\.git|\.svn|\.env|\.htaccess) {
        deny all;
        return 404;
    }

    # API访问控制
    location ~ ^/api/v[1-3]/(users|admin)/ {
        allow 10.0.0.0/8;
        deny all;

        proxy_pass http://api_backend;
        proxy_set_header Host $host;
    }

    # 默认反向代理规则
    location / {
        proxy_pass http://backend_servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

5. 性能优化建议

  1. 避免过度复杂的正则:复杂的正则表达式会增加CPU负载
  2. 使用^$锚定:明确匹配开始和结束位置提高效率
  3. 考虑使用map指令:对于大量规则,map可能更高效
  4. 缓存频繁使用的正则结果
map $uri $block_uri {
    default 0;
    ~* "^/admin/" 1;
    ~* "\.(bak|old|tmp)$" 1;
}

server {
    ...
    if ($block_uri) {
        return 403;
    }
    ...
}

6. 调试技巧

  1. 使用nginx -t测试配置语法
  2. 检查Nginx错误日志/var/log/nginx/error.log
  3. 使用rewrite_log on;调试重写规则

通过合理使用正则表达式,可以在Nginx反向代理中实现强大而灵活的访问控制策略。