使用 rewrite 实现全局 https 重定向需在 80 端口 server 块中配置 rewrite ^ https://$host$request_uri permanent;,利用 $host 自适应多域名并保留子域名与查询参数,例外路径可通过 if ($request_uri ~ ^/(health|debug)) { break; } 跳过重定向。

直接用 rewrite 指令实现全局 HTTPS 强制重定向,核心是匹配所有 HTTP 请求,并统一跳转到对应 HTTPS 地址。虽然 Nginx 官方更推荐 return 301(性能更好、逻辑更清晰),但在某些已有配置习惯或需兼容特定逻辑的场景中,rewrite 仍被广泛使用,且完全可行。
基础 rewrite 配置写法
在监听 80 端口的 server 块中添加以下内容:
-
listen 80;:明确监听 HTTP 流量 -
server_name example.com www.example.com;:指定生效域名,支持多域名,需与 HTTPS 的server_name一致 -
rewrite ^(.*)$ https://$host$1 permanent;:
•^(.*)$捕获完整 URI(含路径和查询参数)
•$1是捕获组,还原原始路径部分
•permanent等价于返回 301 状态码,告诉浏览器和搜索引擎这是永久跳转
为什么用 $host 而不是硬编码域名
使用 $host 变量能自动适配请求头中的 Host 字段,好处包括:
- 同一份配置可支持多个绑定域名(如
example.com和www.example.com),各自跳转到自己的 HTTPS 版本 - 避免因域名变更导致配置遗漏或跳转错误
- 保留用户实际访问的子域名结构(例如访问
api.example.com就跳转到https://api.example.com)
确保查询参数不丢失的关键
很多人误用 $uri 导致问号后的参数(如 ?id=123&ref=abc)丢失。正确做法是:
- 用
^(.*)$+$1组合,天然包含整个请求路径及参数 - 或直接使用
$request_uri(更简洁):rewrite ^ https://$host$request_uri permanent;
注意:这里^表示“匹配任意请求”,无需捕获,配合$request_uri更安全可靠
绕过重定向的例外路径处理
若某些接口(如健康检查 /health 或调试页 /debug)需保持 HTTP 访问,不能被重定向,可在 rewrite 前加条件判断:
- 用
if判断请求路径(Nginx 中if在server上下文中允许用于简单匹配): if ($request_uri ~ ^/(health|debug)) { break; }- 再写
rewrite规则 —— 这样匹配到例外路径时就跳过重定向 - 注意:
if内不可嵌套rewrite或return,但break可终止后续重写流程
不复杂但容易忽略











