访问网站需要白名单?是用nginx来解决

简介 在访问A网站的时候,需要白名单,于是想着,能不能在nginx上配置解决这个问题呢?因为凯哥有个公网IP,是固定的,把公网ip配置到A网站白名单中,然后是用nginx来解决的。直接上代码:    set $nginx_public_ip "123.123.123.123"; # 请写入你添加A网站的白

🔔🔔🔔好消息!好消息!🔔🔔🔔

有需要的朋友👉:联系凯哥 微信号 kaigejava2022

在访问A网站的时候,需要白名单,于是想着,能不能在nginx上配置解决这个问题呢?

因为凯哥有个公网IP,是固定的,把公网ip配置到A网站白名单中,然后是用nginx来解决的。

直接上代码:

    set $nginx_public_ip "123.123.123.123"; # 请写入你添加A网站的白名单ip  

		# 配置
		location /myapi/ {
                # 1. 保存原始参数
        set $orig_args $args;
        
        # 2. 构建新参数 - 使用变量避免$符号问题
        set $fixed_params "appkey=123456&pid=mm_49813693_359950439_100059950089&name=heihei        
        # 3. 合并参数(处理空参数情况)
        if ($orig_args = "") {
            set $args $fixed_params;
        }
        if ($orig_args != "") {
            set $args $orig_args&$fixed_params;
        }
        
        # 4. 路径转换 - 使用rewrite但保留参数
        rewrite ^/myapi/(.*)$ /$1?$args break;
        
        # 5. 代理设置
        proxy_pass  # 这里是需要访问的A网站域名
        
        # 6. IP白名单处理
        proxy_set_header Host a.test.cn; # 设置访问头
        proxy_set_header X-Real-IP $nginx_public_ip;
        proxy_set_header X-Forwarded-For $nginx_public_ip;
        proxy_set_header True-Client-IP $remote_addr;
        
        # 7. 详细的调试信息
        add_header X-Original-Args $orig_args;
        add_header X-Final-Args $args;
        add_header X-Proxy-URL " # 这里的a.test.cn是你需要访问的a网站 
        }

以下是对 Nginx 配置的详细分析和使用场景说明:

配置功能解析

  1. 固定参数注入


    set $orig_args $args;  # 保存原始URL参数set $fixed_params "appkey=xxx&pid=xxx...";  # 预定义固定参数
    • 空参数处理if ($orig_args = "") 直接使用 $fixed_params

    • 非空参数处理if ($orig_args != "") 将原始参数与固定参数用 & 拼接

    • 目的:强制在请求中添加认证/跟踪参数(如 appkeypid

  2. 路径重写


    rewrite ^/myapi/(.*)$ /$1?$args break;
    • 将 /myapi/xxx 重写为 /xxx,并保留拼接后的参数(?$args

    • break 标志终止后续重写规则,直接执行 proxy_pass

  3. 代理与头部控制


    proxy_pass http://a.test.cn;
    proxy_set_header Host a.test.cn;  # 覆盖Host头
    proxy_set_header X-Real-IP $nginx_public_ip;  # 伪装客户端IP
    proxy_set_header X-Forwarded-For $nginx_public_ip;  # 覆盖代理链IP
    proxy_set_header True-Client-IP $remote_addr;  # 保留真实客户端IP
    • IP白名单场景:通过覆盖 X-Forwarded-For 和 X-Real-IP,使后端认为请求来自固定IP(123.123.123.123

    • 审计需求True-Client-IP 记录真实客户端IP供内部审计

  4. 调试支持


    add_header X-Original-Args $orig_args;  # 原始参数
    add_header X-Final-Args $args;  # 最终参数
    add_header X-Proxy-URL "http://...";  # 完整代理URL
    • 通过响应头暴露参数转换和URL信息,便于排查问题


关键使用场景

1. 第三方API鉴权代理

  • 问题:调用第三方API需固定密钥(如 apkey),但客户端不可见该密钥

  • 方案:Nginx层动态注入认证参数,客户端只需请求 /myapi/

  • 优势:避免密钥泄露,统一鉴权管理

2. 联盟营销(Affiliate)跟踪

  • 问题:需要为所有请求添加推广ID(如 pid=mm_49813693...

  • 方案:自动注入推广参数,后端统计佣金归属

  • 典型场景:电商CPS、广告跟踪系统

3. IP白名单访问

  • 问题:后端服务仅允许特定IP访问(如 123.123.123.123

  • 方案:覆盖 X-Forwarded-For 和 X-Real-IP,伪装成白名单IP

  • 注意:需确保Nginx出口IP已被后端信任

4. API版本迁移/路径标准化

  • 问题:后端接口路径变更(如 /aaa 替代旧路径),但需兼容旧客户端

  • 方案:通过 rewrite 转换路径,客户端仍请求 /myapi/

5. 调试与日志审计

  • 问题:排查参数修改是否生效

  • 方案add_header 返回调试信息,无需查看后端日志


潜在优化建议

  1. 参数合并简化
    使用 map 替代 if 避免潜在歧义:


    map $args $new_args {
        default "$args&$fixed_params";
        ""      $fixed_params;}set $args $new_args;  # 直接赋值
  2. 正则性能优化
    rewrite 中的 (.*) 可改为更精确的匹配(如 ^/myapi/([a-zA-Z0-9_]+)$

  3. 生产环境关闭调试头
    移除 add_header 或添加条件判断:


    if ($debug_mode = "1") {
        add_header X-Proxy-URL "http://...";}

总结

此配置的核心逻辑是:在反向代理过程中动态修改请求路径和参数,同时控制客户端IP的传递方式。适用于需要隐藏敏感参数、统一注入跟踪信息、IP访问控制及API路径兼容的场景。
典型行业:电商平台对接、广告跟踪系统、第三方API网关、微服务入口层。





TopTop