全站启用 HTTPS 啦!

这是一篇旧文,其中的内容可能已经过时。

为了跟上 HTTPS 的大潮流,以及防止流量劫持、运营商广告等,我把整个站点迁到了 HTTPS。站点规模很小,所以过程不算复杂,权且记录步骤:

  1. SSL 证书是在 StartSSL 上申请的免费个人版,申请完之后会得到一些文件和一份安装教程。免费版只支持一级域名和 www 二级域名,如想支持所有子域名,需要付费升级证书;

  2. 我的服务器是 Apache(其它服务器按照安装教程来),需要先启用mod_ssl模块,然后在%mysite%.conf中添加 443 端口支持。

  3. 接着,着手把所有的 HTTP 请求重定向至 HTTPS。

    1. .htaccess文件中添加:
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{SERVER_PORT} 80
    RewriteRule ^(.*)$ https://handsomeone.com/$1 [L,R=301,NC]
    </IfModule>
    
    1. HSTS,全称 HTTP Strict Transport Security。浏览器在接收到这个报头之后,在max-age秒数内,会直接在内部把 HTTP 请求转化为 HTTPS 请求,而不需要任何网络传输,从而减轻服务器压力。
    <ifModule mod_headers.c>
    Header set Strict-Transport-Security "max-age=31536000"
    </ifModule>
    
    1. WordPress 支持在wp-config.php里定义一个参数,开启后强制使用 HTTPS 登录后台。
    define('FORCE_SSL_ADMIN', true);
    
  4. 前几步做完之后,别忘了重启 Apache。至此服务器上的配置就做完了。

  5. 下面,进入 WordPress 仪表盘 -> 设置 -> 常规,把 WordPress 地址和站点地址都加上https://

  6. 结束了?还差一点。在一个 HTTPS 页面内容中出现 HTTP 图片、资源文件、iframe等,浏览器会认为这是不安全的。所以这一步就要把所有内容中的资源替换为 HTTPS。可以先批量替换所有博文中的http://字样:

UPDATE `wp_posts` SET `post_content` = REPLACE(`post_content`, 'http://', 'https://')

然后如有遗漏,或者外部资源不支持 HTTPS,再手动修改。