强制 HTTPS:www 与裸域跳转的写法
发布时间:2026-05-14 19:06       
更新时间:2026-05-14 20:51
HTTP 到 HTTPS 的跳转,用一个独立的 server 块专门收 80 端口的请求最省心:80 端口上不放任何业务,只负责 301(永久重定向),职责分开,以后排查问题清晰得多。
80 端口整体跳转
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
$request_uri 保留原始路径和参数。用户从 http://example.com/post/1?a=2 过来,会精确落到 HTTPS 下的同一地址。漏写 $request_uri 的写法会把路径全部丢掉,收藏夹和搜索引擎收录都会受影响。另一种常见写法是在业务 server 块里加 if ($scheme = http) 做判断,能用,但 server 块一多容易散落各处漏改,集中一个跳转块是更好维护的结构,所有跳转规则集中一处,改起来一目了然。
www 与裸域收敛
主域定一个(一般用裸域),另一个 301 过去,单独一个 server 块:
server {
listen 443 ssl;
server_name www.example.com;
return 301 https://example.com$request_uri;
}
证书要同时包含两个域名,签发时用 -d example.com -d www.example.com 一起签;子域多的站点直接用泛域名证书,一次覆盖,省掉每次加子域都重签的麻烦。归一化方向只选一个:定了裸域就全站跳裸域,最忌讳 www 跳裸域、裸域又跳回 www 的循环。
验证要覆盖五种入口
用 curl 逐组验证:裸域、www、带路径、带参数、大写路径。核心是两条:
curl -I http://example.com/post/1
curl -I https://www.example.com/post/1?id=3
响应是 301 且 Location 原样保留路径和参数为正确。路径大小写也过一遍,某些程序对大小写敏感,跳转后路径变了会直接 404。浏览器里也要真实打开验证一遍,看页面资源有没有 http 告警,curl 只能查响应头,查不了页面全貌。
与 HSTS 的配合
跳转稳定运行一段时间后,再开 HSTS,把强制动作前移到浏览器本地,301 从主角退为兜底。开之前做一次最后检查:证书续期定时器在位、到期监控在位、所有子域都有证书,最好再演练一遍证书突然到期的应急步骤。顺序别反:先 301 后 HSTS,中间出问题还有回退余地;上来就 HSTS,证书一旦出事连跳转的机会都没有。每次只动一处,验证一轮再进行下一步,跳转配置最忌连环改,改乱之后回溯非常痛苦。