其实早在3年前就有这个想法,不过由于拖延症与网站访问的人很少就一直放着,直到最近 iOS 开始强制使用 https 以及做小程序时也要求请求都必须是 https。觉得是时候踩下坑。
可能是以前早就了解过流程,操作过程异常顺利,大概半小时就完成了,当然免费的SSL证书是一个月前就已经申请好了。
SSL 证书申请
本站使用阿里云ECS,在后台申请一下免费的赛门铁克,很容易就通过,然后就会得到证书文件。
服务端布署
修改 nginx.conf 配置,由于想全站开启,所以加了规则将 http 下的请求全部重定向到 https 上,以下是核心配置。修改后重启下 nginx 服务即可。另外如果使用类似 WDCP 等管理平台,记得在防火墙设置通过 443 端口。
# http 重定向到 https
server {
listen 80;
server_name www.sawlove.com sawlove.com;
rewrite ^ https://$server_name$request_uri permanent;
}
# https 配置
server {
listen 443 ssl;
server_name www.sawlove.com;
root /www/web/www_sawlove_com/public_html;
index index.html index.php index.htm;
ssl_certificate /www/nginx/cert/www_sawlove_com.pem; #pem文件路径
ssl_certificate_key /www/nginx/cert/www_sawlove_com.key; #key文件路径
}
WordPress 配置
到这里基本上已经完成了,不过本站遇到两个问题:
- 访问站点首页变成直接下载文件
- 站点内页样式与图片均无法显示
第一个问题起初想的是 rewrite 或 php 文件的问题,不过把 rewrite 删除以及将测试将文章页也改为 php 却正常,后面换台电脑访问确定是缓存原因;第二个问题一下子就能看出是资源协议问题,所以将七牛的 cdn 关了(默认的 https 域名访问很慢,自定义域名的 https 很贵…),然后进入 phpmyadmin 执行 sql 语句批量替换原来的 http 协议。
UPDATE wp_posts SET post_content = replace(post_content, 'http://www.sawlove.com/', 'https://www.sawlove.com/');
UPDATE wp_posts SET guid = replace(guid, 'http://www.sawlove.com/', 'https://www.sawlove.com/');
UPDATE wp_options SET option_value = replace(option_value, 'http://www.sawlove.com/', 'https://www.sawlove.com/');
UPDATE wp_comments SET comment_author_url = replace(comment_author_url, 'http://www.sawlove.com/', 'https://www.sawlove.com/');