nginx可通过map预判内网ip并设跳转开关,在80端口server块中用if条件控制301跳转,使白名单ip访问指定路径(如/healthz、/captcha/callback)时绕过https强制跳转,保留http明文传输;配合location ^~与allow/deny实现路径级内网直通,兼顾安全与业务需求。

当全站强制 HTTPS 时,某些内部路径(如健康检查、人机验证回调、调试接口)仍需支持 HTTP 访问,尤其来自内网 IP。Nginx 本身不支持“对某目录关闭 HTTPS”,但可通过条件跳转和访问控制组合实现等效效果——核心是让这些请求**绕过 301 跳转逻辑,且允许明文传输**。
在 80 端口 server 块中精准跳过跳转
这是最常用也最稳妥的方式:不是“关闭限制”,而是“不让它触发限制”。关键在于把白名单判断放在跳转之前。
- 用 map 指令预判 IP 是否属于内网段(如 172.16.0.0/12、192.168.0.0/16、10.0.0.0/8),设变量(如
$skip_https_redirect)为 0 - 在
server { listen 80; }块顶部用if ($skip_https_redirect = 1) { return 301 https://...; } - 这样,匹配白名单的请求直接进入后续 location 处理,不会被重定向
对特定路径启用内网 HTTP 直通
如果只开放个别路径(比如 /healthz 或 /captcha/callback),可用 location ^~ 配合 IP 控制:
location ^~ /healthz { allow 172.16.0.0/12; allow 192.168.0.0/16; deny all; proxy_pass http://backend; }-
^~确保前缀匹配优先,不参与正则竞争;allow/deny严格限定来源;不写return或rewrite,就自然保留 HTTP 协议 - 注意:若前端有 CDN 或代理,需配合
set_real_ip_from和real_ip_header正确识别真实客户端 IP
避免 HTTPS 降级风险的配套措施
放行 HTTP 不等于放松安全,尤其在混合协议场景下:
- 443 端口 server 块中不要配置同一路径的 HTTP 回退逻辑,防止意外降级
- 敏感路径(如
/admin、/api/v1/internal)即使走 HTTP,也应叠加auth_basic或 IP 白名单 - 禁止在放行路径中返回 Cookie 或敏感数据,除非明确信任该网络环境
- 日志中建议记录
$scheme和$remote_addr,便于审计明文请求来源
不推荐但偶见的替代方式
有些配置尝试用 if ($scheme = "http") { ... } 分流,或在 location 内用 return 200 中断跳转——这些方式易受 Nginx 指令执行顺序影响,可靠性低,且可能干扰反向代理逻辑,不建议生产使用。











