HTTP 跳转 HTTPS 是什么
在 80 端口把明文请求重定向到 HTTPS,是启用 TLS 之后最基础的一步:用户在浏览器里输入域名或点开老链接时,先命中 80 端口再被 301 跳到 HTTPS。要点是保留完整 URI 与查询串,并且在有前置代理终止 TLS 的环境中避免出现跳转循环。
基本信息
| 状态码 | 301 永久重定向(可被缓存)、308 保留请求方法与请求体 |
|---|---|
| nginx 写法 | return 301 https://$host$request_uri;(比 rewrite 更轻量) |
| 保留项 | 原路径与查询串一并保留,避免丢参数 |
| 反代场景 | 上游已终止 TLS 时需依据 X-Forwarded-Proto 判断,避免死循环 |
| 配套项 | HSTS、Cookie 的 Secure 属性、静态资源的协议相对引用 |
| 验证方式 | curl -sI 查看状态码与 Location |
典型使用场景
- 站点全量强制 HTTPS:所有明文入口统一收敛
- 老链接兼容:历史的收藏与外部引用仍指向 http 时能自动跳转
- 多端口收敛:8080、8000 等备用端口同样跳转到 443
- API 域名强制加密:避免请求与令牌明文传输
- 静态资源域名:CDN 上的图片与脚本域名同样需要跳转与 HSTS
nginx 跳转片段
nginx 跳转片段
server {
listen 80;
server_name example.com www.example.com;
# return 比 rewrite 轻量,且能直接保留路径与查询串
return 301 https://$host$request_uri;
}
# 若上游负载均衡已终止 TLS,源站不应再判断协议做跳转,否则可能形成循环
# 需要时依据 X-Forwarded-Proto 判断,并信任可信代理来源验证跳转行为
验证跳转行为
# 查看状态码与 Location,确认路径与查询串被完整保留
curl -sI http://example.com/path?a=1 | grep -iE 'HTTP/|location'
# 检查是否出现重定向循环(-L 会跟随并要求限制次数)
curl -sIL --max-redirs 5 http://example.com | grep -iE 'HTTP/|location'
# 确认最终落地页是 HTTPS 且返回 200
curl -sIL http://example.com -o /dev/null -w '%{url_effective} %{http_code}\n'状态码选择
| 状态码 | 语义 | 适用场景 |
|---|---|---|
| 301 | 永久重定向 | 绝大多数站点首选,浏览器与搜索引擎会缓存 |
| 302 | 临时重定向 | 灰度或临时维护期使用 |
| 307 | 临时且保留方法 | 需要保留 POST 方法与请求体的临时跳转 |
| 308 | 永久且保留方法 | 需要长期保留方法与请求体的跳转 |
前置代理已终止 TLS 时,源站再判断「请求是 http 就跳到 https」会产生无限重定向:源站看到的始终是 http。正确做法是信任代理传来的协议头,或干脆让最外层设备统一负责跳转。
跳转是第一步而不是全部:还应在 HTTPS 响应里加 HSTS,给会话 Cookie 加 Secure 与 HttpOnly,并排查页面里写死的 http 资源引用,否则会出现混合内容告警,浏览器仍会标记为不安全。