网站HTTPS升级全攻略:从证书选型到全站301跳转的避坑笔记
为啥必须搞HTTPS
去年接手一个老站,流量一直上不去,老板天天追着问。排查了一圈发现HTTP站点的跳出率高得离谱,浏览器那个”不安全”的小红标直接劝退用户。改成HTTPS之后,三个月内自然搜索流量涨了34%,转化率也跟着往上走。
HTTPS早就是Google的排名信号了,百度也在搜索结果里给HTTPS站点加锁标。Chrome从90版本开始,HTTP站点直接弹全屏警告,用户看见就跑。不升级HTTPS,等于把流量往外推。
证书选型:别被卖证书的忽悠
SSL证书这玩意儿水很深,先看个对比:
| 证书类型 | 验证方式 | 签发时间 | 价格区间 | 适用场景 |
|---|---|---|---|---|
| DV | 域名验证 | 10分钟 | 免费-几百 | 个人站、博客 |
| OV | 组织验证 | 3-7天 | 千元起 | 中小企业官网 |
| EV | 扩展验证 | 7-14天 | 几千起 | 金融、电商 |
别迷信付费证书。Let’s Encrypt的DV证书完全够用,90天自动续期,0成本。我手上20多个站全用它,没出过岔子。OV和EV主要给金融电商用,普通站点上OV纯属浪费钱。
申请Let’s Encrypt证书的实战操作
CentOS+Nginx环境,用certbot最省事:
# 安装certbot
yum install -y epel-release
yum install -y certbot python3-certbot-nginx
# 申请证书并自动配置Nginx
certbot --nginx -d example.com -d www.example.com
# 测试自动续期
certbot renew --dry-run
申请完证书路径在 /etc/letsencrypt/live/example.com/ 下,fullchain.pem是证书链,privkey.pem是私钥。
Nginx配置HTTPS并强制跳转
这是最容易踩坑的一步。很多新手配完HTTPS,HTTP还能访问,等于白搞。正确写法:
# HTTP强制跳转HTTPS
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
# HTTPS站点
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# 强制HSTS,告诉浏览器以后都用HTTPS访问
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# SSL优化配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
root /www/wwwroot/site;
index index.html index.php;
}
几个关键点:开启http2能多路复用,加载速度立竿见影提升;HSTS头必须加,防止SSL剥离攻击;TLSv1.0和1.1早该淘汰了,存在已知漏洞。
混合内容处理
升级HTTPS之后最容易翻车的是混合内容。页面上只要有一个HTTP资源(图片、JS、CSS),浏览器地址栏的锁标就变成感叹号,用户一看就紧张。
排查方法:打开Chrome开发者工具的Console,所有被拦截的混合内容请求都会报错。逐个改成HTTPS或者相对协议 //。
如果是WordPress站,数据库里的文章内链全是HTTP,一条SQL搞定:
UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://example.com', 'https://example.com');
UPDATE wp_options SET option_value = REPLACE(option_value, 'http://example.com', 'https://example.com') WHERE option_name IN ('home', 'siteurl');
别忘了 wp_postmeta 表里的链接也要改,不然一些自定义字段里的图片URL还是HTTP。
全站301跳转的权重传递
HTTP转HTTPS必须用301永久重定向,302是不传递权重的。跳转之后老URL的权重会慢慢转移到新URL,周期一般2-8周。
但是有个坑:百度对HTTPS跳转的反应比Google慢很多,新站改版后百度收录可能停滞一个月。别慌,保持301稳定,慢慢就恢复了。Google Search Console里记得添加HTTPS版本的属性,提交新sitemap。
续期监控不能省
Let’s Encrypt证书90天过期,忘了续期直接全站报错。我见过太多公司因为这事翻车。建议两套保险:
- 服务器crontab配置自动续期任务
- 配一个UptimeRobot监控,证书过期前7天告警
# crontab每天凌晨3点检查续期
0 3 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"
续期脚本上线后,手动跑一次 certbot renew --force-renewal 验证流程能跑通,别等真过期才发现脚本有问题。
CDN的HTTPS配置别漏
源站升级HTTPS了,CDN侧也得跟上。CDN控制台里上传证书,回源协议选HTTPS。否则用户访问CDN域名时浏览器报红,等于白搞。
阿里云和腾讯云CDN都支持免费上传自有证书,或者一键申请Let’s Encrypt。回源鉴权记得开启,防止源站被绕过CDN直接访问。
性能数据验证
某站点HTTPS升级前后对比:
| 指标 | HTTP时期 | HTTPS+HTTP2后 |
|---|---|---|
| 首屏加载 | 2.8s | 1.9s |
| 跳出率 | 68% | 52% |
| 自然流量 | 基准 | +34% |
| SSL Labs评分 | F | A |
HTTP2的多路复用加上SSL会话缓存,性能不降反升。别信那些说HTTPS拖慢速度的言论。
避坑清单
- 别用自签证书,浏览器报红没人敢访问
- CDN的HTTPS配置别漏,源站HTTPS了CDN没跟上等于白搞
- HSTS开启前先确认所有子域名都支持HTTPS,否则会锁死
- SSL Labs评分拿到A再算完工,地址:ssllabs.com/ssltest
- 续期脚本测试一定要跑
--dry-run,别等真过期才发现问题 - 混合内容排查用Chrome的Lighthouse,比手动翻Console全