最直接有效的方式是用 rewrite 指令配合 permanent 标志实现 http 到 https 的 301 永久重定向;它简洁明确、搜索引擎友好,支持保留域名、路径及参数,并可通过 if 条件增强安全性与灵活性。

最直接有效的方式是用 rewrite 指令配合 permanent 标志,实现 HTTP 到 HTTPS 的 301 永久重定向。它简洁、明确,且被搜索引擎友好识别。
基础写法:匹配全部请求并跳转
在监听 80 端口的 server 块中添加:
server {
listen 80;
server_name example.com www.example.com;
rewrite ^ https://www.php.cn/link/21964698b7df1cefa6befc89697f5293? permanent;
}
说明:
-
^表示匹配任意 URI(等价于“所有请求”); -
$host保留原始域名,避免硬编码; -
$request_uri包含完整路径和查询参数(如/path?a=1),确保跳转不丢参; - 末尾加
?可清除原始 query 中可能重复的参数(Nginx 默认会自动拼接,加?能避免二次携带); -
permanent触发 301 响应,浏览器和搜索引擎将更新索引。
更安全的写法:限制仅对非 HTTPS 请求生效
避免与已有的 HTTPS server 块冲突,推荐显式排除 HTTPS 协议:
server {
listen 80;
server_name example.com www.example.com;
if ($scheme = http) {
rewrite ^ https://www.php.cn/link/21964698b7df1cefa6befc89697f5293? permanent;
}
}
注意:if 在 location 外使用是安全的,此处用于协议判断,不会引发常见陷阱。
兼容多域名或泛解析场景
若需统一跳转到主域名(如强制 www 或去 www),可组合使用:
# 强制跳转到 https://www.example.com
rewrite ^ https://www.example.com$request_uri? permanent;
<h1>或者先规范域名,再升 HTTPS(两步合一)</h1><p>if ($host !~ ^www.) {
rewrite ^ <a href="https://www.php.cn/link/3e477743dda87ebc24d3c93bfb817d58">https://www.php.cn/link/3e477743dda87ebc24d3c93bfb817d58</a>? permanent;
}
if ($scheme = http) {
rewrite ^ <a href="https://www.php.cn/link/21964698b7df1cefa6befc89697f5293">https://www.php.cn/link/21964698b7df1cefa6befc89697f5293</a>? permanent;
}</p>
关键点:
- 多个
if是顺序执行,建议按“域名 → 协议”逻辑组织; - 避免嵌套
if,Nginx 不支持; - 测试时可用
redirect临时替代permanent,防止缓存干扰。
对比 return 方案:为什么有时 prefer rewrite?
return 301 https://...; 更轻量、优先级更高,但 rewrite 在以下情况更灵活:
- 需要结合
if做复合判断(如仅对特定 User-Agent 或路径跳转); - 要复用正则捕获(例如提取子域名做动态跳转);
- 已有复杂 rewrite 链路,统一用 rewrite 维护风格。
不过,纯协议升级场景下,return 仍是首选——它不触发重匹配、无正则开销、逻辑更清晰。











