所有部署指南 部署

如何将 HTTP 重定向到 HTTPS

安装 SSL 证书后,你需要将所有 HTTP 流量重定向到 HTTPS。没有重定向,访问 http://yourdomain.com 的访客不会使用加密连接——即使 HTTPS 可用。

使用 301(永久)重定向以便搜索引擎将所有排名信号转移到 HTTPS URL。

Nginx

添加一个单独的 server 块用于端口 80 重定向所有请求:

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

这会保留完整的 URL 路径:http://example.com/page?q=1https://example.com/page?q=1

编辑后,测试并重新加载:

sudo nginx -t && sudo systemctl reload nginx

Apache

方案一:VirtualHost 重定向(推荐)

添加到你的 Apache 配置:

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    Redirect permanent / https://example.com/
</VirtualHost>

方案二:.htaccess(共享主机)

如果你没有 VirtualHost 配置的访问权限(共享主机),添加到网站的 .htaccess

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

需要启用 mod_rewrite

更改后:

sudo apachectl configtest && sudo systemctl reload apache2

验证重定向

# Should return 301 with Location: https://...
curl -I http://yourdomain.com

预期输出:

HTTP/1.1 301 Moved Permanently
Location: https://yourdomain.com/

HSTS:双重锁定

确认重定向正常后,添加 HSTS(HTTP Strict Transport Security)。它告诉浏览器始终使用 HTTPS,即使用户输入 http://

Nginx:

add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;

Apache:

Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"

先用短的 max-age(如 300 秒)测试,确认一切正常后再增加到 2 年(63072000)。

警告: 一旦 HSTS 以长 max-age 激活,即使你移除 HTTPS,浏览器也会拒绝通过 HTTP 连接。确保你的 HTTPS 配置稳定后再设置长期限。

常见重定向模式

www 重定向到非 www + HTTPS

# Nginx: www → non-www, HTTP + HTTPS → HTTPS
server {
    listen 80;
    listen 443 ssl;
    server_name www.example.com;
    ssl_certificate     /etc/ssl/fullchain.pem;
    ssl_certificate_key /etc/ssl/privkey.pem;
    return 301 https://example.com$request_uri;
}

非 www 重定向到 www + HTTPS

server {
    listen 80;
    listen 443 ssl;
    server_name example.com;
    ssl_certificate     /etc/ssl/fullchain.pem;
    ssl_certificate_key /etc/ssl/privkey.pem;
    return 301 https://www.example.com$request_uri;
}

重定向整个旧域名

server {
    listen 80;
    listen 443 ssl;
    server_name olddomain.com www.olddomain.com;
    ssl_certificate     /etc/ssl/old-fullchain.pem;
    ssl_certificate_key /etc/ssl/old-privkey.pem;
    return 301 https://newdomain.com$request_uri;
}

旧域名也需要有效的 SSL 证书——浏览器必须先建立 HTTPS 才能接收重定向。使用覆盖两个域名的 SAN 证书,或为旧域名单独准备一个证书。

故障排查

重定向循环 (ERR_TOO_MANY_REDIRECTS)

这通常意味着你的 HTTPS server 块也在重定向到 HTTPS。检查只有端口 80 的块有重定向——端口 443 的块应该正常提供内容。

另一个原因:负载均衡器或代理(Cloudflare、AWS ALB)终结 SSL 并转发 HTTP 到你的服务器。你的服务器看到 HTTP 就重定向。通过检查 X-Forwarded-Proto 头修复:

# Behind a proxy/load balancer
if ($http_x_forwarded_proto = "http") {
    return 301 https://$host$request_uri;
}

搜索引擎中缓存的旧 HTTP URL

设置重定向后,告诉 Google 变化:

  1. <link rel="canonical"> 更新为使用 https://
  2. 将站点地图 URL 更新为 https://
  3. 在 Google Search Console 中添加 HTTPS 资源

Google 会在跟随 301 重定向时逐步更新已索引的 URL。

常见问题

应该同时将 www 重定向到非 www(或反之)吗?

是的。选择一种规范形式并重定向另一种。这避免搜索引擎中的重复内容:

# Redirect www to non-www (Nginx)
server {
    listen 80;
    listen 443 ssl;
    server_name www.example.com;
    return 301 https://example.com$request_uri;
}

重定向会影响 SEO 吗?

301 重定向将排名信号传递给目标 URL。Google 推荐使用 301 重定向进行 HTTP 到 HTTPS 迁移。可能有小幅临时波动,但长期 SEO 会因 HTTPS 排名信号而改善。

重定向后的混合内容怎么办?

重定向处理页面 URL,但如果你的 HTML 以 http:// URL 引用资源(图片、脚本、CSS),浏览器会阻止它们或显示警告。参见我们的混合内容修复指南

如何测试重定向是否正常工作?

# Check redirect chain
curl -ILs http://yourdomain.com | grep -E '^HTTP|^Location'

预期输出:

HTTP/1.1 301 Moved Permanently
Location: https://yourdomain.com/
HTTP/2 200

第一个响应应该是 301 带有 HTTPS Location,最终响应应该是 200。

应该在 DNS 级别还是服务器级别重定向?

服务器级别(Nginx/Apache 配置或 .htaccess)。DNS 级别重定向(如 Cloudflare 的 Page Rules)可以工作但增加了网络跳数,且你对重定向行为的控制更少。服务器级别重定向更快更可靠。

相关文章

部署 2026-05-08
如何在 Nginx 上安装 SSL 证书
在 Nginx 上安装 SSL 证书的分步指南。涵盖文件上传、完整 server 块配置、TLS 最佳实践、HTTP/2、HSTS、重定向设置、测试以及 6 个常见错误的排查方法。
部署 2026-05-08
如何在 Apache 上安装 SSL 证书
使用 mod_ssl 在 Apache 上安装 SSL 证书的分步指南。涵盖文件上传、VirtualHost 配置、TLS 最佳实践、HSTS、HTTP 重定向以及 5 个常见错误的排查方法。
快速开始 2026-05-08
如何获取免费 SSL 证书(分步指南)
5 分钟从 Let's Encrypt 获取免费 SSL 证书 — 无需安装软件、无需注册账号。涵盖 4 种方法、两种验证方式、6 个平台的安装教程和故障排除。
在浏览器中获取免费 SSL 证书
无需安装,无需账号。私钥始终留在你的设备上。
获取证书