网站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天过期,忘了续期直接全站报错。我见过太多公司因为这事翻车。建议两套保险:

  1. 服务器crontab配置自动续期任务
  2. 配一个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全