安装 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=1 → https://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 变化:
- 将
<link rel="canonical">更新为使用https:// - 将站点地图 URL 更新为
https:// - 在 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)可以工作但增加了网络跳数,且你对重定向行为的控制更少。服务器级别重定向更快更可靠。