最常用、最可靠的方式是用return 301指令在listen 80的server块中重定向至https://$server_name$request_uri;同时需配置独立的443端口server块启用SSL证书及HSTS头。

在 Nginx 中实现全站强制 HTTPS,最常用、最可靠的方式是使用 return 301(而非 rewrite)重定向 HTTP 请求到 HTTPS。虽然标题提到 “Rewrite”,但实际生产环境中,不推荐用 rewrite 实现全站跳转,因为 rewrite 更适合路径改写,而协议跳转用 return 更高效、语义更清晰、性能更好。
✅ 推荐方式:用 return 301 实现 HTTP → HTTPS 强制跳转
在监听 80 端口的 server 块中,直接返回永久重定向:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}-
$server_name 保持原域名(支持多域名时建议配合
map或多个 server 块) - $request_uri 完整保留路径和查询参数,避免丢失 GET 参数
- 301 是永久重定向,有利于 SEO 和浏览器缓存
⚠️ 如果非要用 rewrite(不推荐,仅作了解)
语法上可以这样写,但存在隐式循环风险且效率低:
server {
listen 80;
server_name example.com;
rewrite ^(.*)$ https://$server_name$1 permanent;
}-
permanent等价于 301,但底层仍走 rewrite 引擎,多一次正则匹配 -
^.*$匹配所有请求,$1捕获全部路径 —— 不如$request_uri直观安全 - 若配置不当(如未限定 server_name 或漏掉 root),可能引发重定向循环
? 补充 HTTPS 站点的必要配置(不能只做跳转)
确保 443 端口的 server 块已正确启用 TLS:
server {
listen 443 ssl http2;
server_name example.com www.example.com;
<pre class="brush:php;toolbar:false;">ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
# 推荐添加 HSTS 头,让浏览器自动跳转且不发 HTTP 请求
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# 其他常规配置...
root /var/www/html;
index index.html;}
- 务必检查证书路径真实存在,权限正确(Nginx 进程可读)
- 开启
http2提升 HTTPS 性能(需 OpenSSL ≥ 1.0.2 + Nginx ≥ 1.9.5) - HSTS 能防止首次访问被降级攻击,但启用后无法临时回退 HTTP
? 验证是否生效
- 终端执行:
curl -I http://example.com→ 应返回HTTP/1.1 301 Moved Permanently和Location: https://... - 浏览器访问
http://地址,地址栏应自动变为https://且无警告 - 检查响应头是否有
Strict-Transport-Security(HTTPS 块中配置后才生效)


















