全站启用 HTTPS 啦!
更新:StartSSL 的证书由于某些原因已被 Mozilla 和 Google 封杀,已迁移至 Let’s Encrypt。
为了跟上 HTTPS 的大潮流,以及防止流量劫持、运营商广告等,我把整个站点迁到了 HTTPS。站点规模很小,所以过程不算复杂,权且记录步骤:
- SSL 证书是在 StartSSL 上申请的免费个人版,申请完之后会得到一些文件和一份安装教程。免费版只支持一级域名和 www 二级域名,如想支持所有子域名,需要付费升级证书;
- 我的服务器是 Apache(其它服务器按照安装教程来),需要先启用
mod_ssl
模块,然后在%mysite%.conf
中添加 443 端口支持:
1234567891011121314151617LoadModule ssl_module modules/mod_ssl.soListen 443<VirtualHost handsomeone.com:443>DocumentRoot /home/blog/zhouErrorLog /home/zq/logs/error_logTransferLog /home/zq/logs/access_logSSLEngine onSSLProtocol all -SSLv2 -SSLv3SSLCipherSuite ALL:!DH:!EXPORT:!RC4:+HIGH:+MEDIUM:!LOW:!aNULL:!eNULLSSLCertificateFile /home/zq/domain.crtSSLCertificateKeyFile /home/zq/private.keySSLCertificateChainFile /home/zq/1_root_bundle.crtCustomLog /home/zq/logs/ssl_request_log \"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"</VirtualHost> - 接着,着手把所有的 HTTP 请求重定向至 HTTPS。
- 在
.htaccess
文件中添加:
123456<IfModule mod_rewrite.c>RewriteEngine On# HTTPSRewriteCond %{SERVER_PORT} 80RewriteRule ^(.*)$ https://handsomeone.com/$1 [L,R=301,NC]</IfModule> - HSTS,全称 HTTP Strict Transport Security。浏览器在接收到这个报头之后,在
max-age
秒数内,会直接在内部把 HTTP 请求转化为 HTTPS 请求,而不需要任何网络传输,从而减轻服务器压力。
12345# BEGIN HSTS<ifModule mod_headers.c>Header set Strict-Transport-Security "max-age=31536000"</ifModule># END HSTS - WordPress 支持在
wp-config.php
里定义一个参数,开启后强制使用 HTTPS 登录后台。
1define('FORCE_SSL_ADMIN', true);
- 在
- 前几步做完之后,别忘了重启 Apache。至此服务器上的配置就做完了。
- 下面,进入 WordPress 仪表盘 -> 设置 -> 常规,把 WordPress 地址和站点地址都加上
https://
。 - 结束了?还差一点。在一个 HTTPS 页面内容中出现 HTTP 图片、资源文件、
iframe
等,浏览器会认为这是不安全的。所以这一步就要把所有内容中的资源替换为 HTTPS。可以先批量替换所有博文中的http://
字样:
12UPDATE `wp_posts`SET `post_content` = REPLACE(`post_content`, 'http://', 'https://')