不能用 map 指令实现基于请求 Scheme 的静态资源全自动 HTTP 到 HTTPS 跳转,因为 map 仅用于变量映射,不触发重定向;真正有效的方式是在 listen 80 的 server 块中使用 return 301 https://$host$request_uri。

不能用 map 指令实现“基于请求 Scheme 的静态资源全自动 HTTP 到 HTTPS 跳转”。
map 不参与跳转逻辑
map 是变量映射工具,只负责根据输入(如 $scheme、$http_user_agent)生成新变量,它本身:
- 不触发重定向(301/302)
- 不修改响应状态码或 Location 头
- 不能替代 return 或 rewrite 指令完成跳转动作
真正有效的 HTTP → HTTPS 跳转方式
要让所有 HTTP 请求(尤其是静态资源路径)自动跳转到 HTTPS,应在 server 块中明确配置跳转规则:
- 监听 80 端口的 server 块内使用 return 301 https://$host$request_uri;
- 避免用 rewrite,因 return 更高效、无正则开销
- 若需排除某些路径(如健康检查),可用 if + return 组合,但应谨慎避免嵌套
静态资源跳转无需区分 Scheme 来源
所谓“基于 Scheme”跳转,本质是“非 HTTPS 请求就跳”。这和资源类型(JS/CSS/图片)无关,而由访问协议决定:
- 用户用 http://example.com/logo.png 访问 → 应跳转至 https://example.com/logo.png
- 该行为由最外层 server { listen 80 } 控制,不是靠 map 动态判断每个请求的 $scheme
- map 即使映射了 $scheme,也无法让 Nginx “自动执行跳转”,仍需显式 return
map 在 HTTPS 场景中的合理用途
map 可用于辅助 HTTPS 环境下的其他策略,例如:
- 根据 $scheme 设置不同缓存头:add_header Cache-Control $cache_policy;(但注意:这不是跳转)
- 配合 proxy_pass 动态选择后端协议(如 http://backend 或 https://backend)
- 标记日志字段,区分 HTTP/HTTPS 流量来源

















