自从 CNNIC 颁发的子证书发生了中间人攻击这些事件之后,SSL 连接以及 HTTPS 变得越来越流行了。这时候我们从“使用 SSL 保护你的登录信息以及后台页面”变成了推荐“SSL Everywhere”,使用全局 SSL 加密,有效避免用户在访问网页的时候造成隐私的泄露。而且,根据谷歌站长的最新教程当中的介绍表示,使用 https 对 SEO 更有好处(国内就别想了,但谷歌的爬虫真的会更看重 Https 网站。)另外,升级到 Https,也不需要在谷歌站长工具里做什么——支持平滑升级,唯一的缺点恐怕是收录会波动一小段时间。
这里,我们要感谢 StartSSL™ ,如果不是他们,恐怕我们这些微小站长个人博客博主就无缘 SSL 了。。
由于这个原因,落格不在使用 StartSSL 的免费证书了,而是转而使用备受关注的 Let’s Encrypt 项目,这样你可以很方便地获得个人免费证书。不过,如果你和我一样是把博客扔在虚拟主机,那我想你可能需要这个网站以支持虚拟主机的 cPanel 等后台配置。
对于如何申请证书这个问题,这里暂时略过不讲,总之这篇文章假定你至少拥有了一个有效签名的证书以及对应的域名。
关于 HTTPS 的那点不得不讲的事情
HTTPS 使用443端口来验证你的链接,通过 SSL、TLS 这种低层的加密技术来保证你的连接是安全的,由于 SSL 这种协议在 IP 层面上,所以建立安全握手的时候甚至还没有发生 HTTP 数据的交换,这就导致了 SSL 这个本身针对域名进行签名的证书却需求你有一个独立的 IP 地址。不过,现实很快就无情地证明——IPv4 地址终究会被用尽。虚拟主机应运而生,这时候我们很庆幸的还能有一个独立的域名和空间,但 IP 地址却是共享的。
Web 服务器通过区分来自不同域名的请求来在同一 IP 的同一端口上提供不同的网站服务,这就导致了一个严重的问题:“SSL 证书绑定给谁?”事实上虚拟主机确实很难支持 SSL,一不小心就会导致同 IP 下的其他域名提示证书不正确。不过,现如今的主流浏览器都支持了一个新的协议:SNI。
使用 SNI,将允许 Web 服务器在同一 IP 上单独为每一个域名提供证书。
所以说,如果你想要在一个 IP 上绑定多个域名的证书,或者说你依旧使用着经济实惠的虚拟主机,想要绑定证书,那么就需要确定你的主机可以支持 SNI——当然了,目前主流的服务器比如 Nginx、Apache 等都已经支持,唯独要点名的是 IIS 貌似还是不支持的。
至于浏览器,Safari、Chrome、Firefox 等知名浏览器都已经支持,要点名的是 IE 系列貌似 5678 都不太好使。
好了,扒完了背景,我们正式开始操作:
由于落格依旧是虚拟主机配置,这里我们讲如何用 cPanel 来开启 SSL:
一、开启 SSL 访问支持
登录你的 cPanel,如果你的虚拟主机支持 SNI 技术(就看服务商给不给力了),那么你应该可以在 cPanel 面板中的“安全”分类里边找到“SSL/TLS”功能按钮。
点击进入之后你就会看到上传私钥公钥以及绑定域名的链接,依次进入上传之,然后选择去绑定链接里绑定自己的域名“www”即可。(这里要注意,如果你和落格一样使用的是一类证书,那么你应该没有资格签泛域名证书,裸域应该也是不行的。)
绑定之后,你的博客应该就已经能够使用 Https 来访问了,不过,这才刚刚开始。
二、开启访问 HTTPS 301重定向
细心的你这时候一定会发现,你的网站这时候虽然支持了 HTTPS 访问,但是似乎也可以使用 HTTP 来访问,考虑到搜索引擎目前收录的都是你的 HTTP 链接,那么如果不做点什么的话恐怕这张 SSL 证书将会毫无用处!
我希望你的空间能够支持 .htaccess ,如果你的博客开启了伪静态的话,那八成你的空间是支持的。 :)
我们使用 .htaccess 文件来添加一个301重定向(其实还有其他各种迁移的办法,但是谷歌大爷官方推荐使用301重定向)将所有的 HTTP 流量使用301重定向到 HTTPS 上边去,当然,这样还有一个潜在的问题:国内百度等搜索引擎的爬虫不支持 HTTPS!
我很好奇,为什么在全世界都提倡 SSL Everywhere 的情况下,我国国内的互联网环境还是“明文走天下”,当然,这可能也跟那个“Girl Friend Wall”有关系吧……(不然不好和谐了啊~)所以,我们还要单独为国内的一些搜索引擎的爬虫定制一下规则,如果检测到他们的 UA,那么就允许他们访问 HTTP 流量。
在你博客空间的 www 目录(有的可能是 public_html )下,找到 .htaccess 文件,编辑它,在里边填入下列代码:
1
2
3
4
5
|
#网站定制化开启 HTTPS 的301重定向
RewriteCond %{SERVER_PORT} !^443$
RewriteCond %{HTTP_USER_AGENT} !MSIE/[1–8]\. [NC]
RewriteCond %{HTTP_HOST} www.logcg.com
RewriteRule ^.*$ https://www.logcg.com%{REQUEST_URI} [L,R=301]
|
对了,考虑到巨硬的 IE 大爷,我们把12345678都排除在外,让它们妥妥的滚去访问 HTTP 吧,省的各种警告烦心。
三、开启登录和后台的强制 SSL
虽然有了整站的重定向,但我们不妨还是将 WordPress 本身自带的功能打开,以期更完善的兼容体验——毕竟是301重定向。
还是找到你网站根目录里边,这次要修改的文件是 config.php,直接在这个文件的末尾另起一行,追加两行代码:
1
2
3
|
/* 强制后台和登录使用 SSL */
define(‘FORCE_SSL_LOGIN’, true);
define(‘FORCE_SSL_ADMIN’, true);
|
四、站内链接支持
最主要的可能就是图片的问题了,你在上传到空间的附件都被 WordPress 标记为了绝对链接,而且全都妥妥的写入了 “http://”。一般来讲,是需要用数据库替换的,不过这种方法有点小危险,我这里给你推荐另外一个不错的选择:使用代码让 WordPress 在加载附件之前将链接替换就好了!——毕竟,只是协议的问题,跟路径没有半毛钱的关系~
(我希望你使用了 WordPress 的子主题功能……)
找到当前主题下的 function.php 文件,编辑之,在里边代码的末尾追加如下代码:
1
2
3
4
5
6
7
8
|
/* 替换图片链接为 https */
function my_content_manipulator($content){
if( is_ssl() ){
$content = str_replace(‘http://www.logcg.com/wp-content/uploads’, ‘https://www.logcg.com/wp-content/uploads’, $content);
}
return $content;
}
add_filter(‘the_content’, ‘my_content_manipulator’);
|
另外,除了这个大头意外,你还需要关心站内的各种内链:
- 修改“菜单”当中的所有“自定义链接”为相对路径;
- 修改“设置”→“常规”里的“站点地址”和“WordPress 地址”为 HTTPS;
- 修改其他自己手贱写入的绝对链接地址……
五、关心一下插件
现在,还剩下最后一个问题:插件的兼容性!
是的没错!并不是所有的插件都会兼容 SSL!(尤其是国内的插件)
对了!关于 CNZZ 这个统计的话你只需要改动一下统计代码就可以,将 HTTP 修改为 HTTPS 即可。不过国内比较常用的 JiaThis 社会化分享插件就无力了,只能割爱停删。
另外,曾今“我爱水煮鱼”开发的相关文章插件:WordPress Related Post,后来卖给了老外,总是会加载一个站外的链接,如今还因为 Girl Friend Wall 的问题导致这个 js 脚本各种菊花,只好果断停删。
你可以使用任意浏览器,打开你的博客页面之后随便打开一篇文章,选择类似于“检查元素”的操作,查看报错就可以了:要求是没有任何红色的错误,黄色的警告“⚠️”可以忽略。
关于删除的插件那功能怎么办?
当然是找替换插件了,这里针对如上的两个插件,路由推荐两个插件:
- anyShare 它是一个功能简洁十分轻量级的社会化分享插件,按钮比较大(你可以稍后在这片文章末尾看到样式),虽然说它已经10个月没有更新,但我向你保证这玩意儿绝对兼容最新版本的 WordPress 并且功能完美。:)
- Yet Another Related Posts Plugin 这个是另外一个相关文章插件,再也没有烦人的站外链接了,免费版功能足够,而且同样支持RSS,而且现在它的配置界面也不再那么让人望而生畏,对了!虽然它同样被提示不兼容最新版——但我保证,这玩意儿同样功能正常~
最后,你可以到这个页面来参考落格都使用了哪些狂拽炫酷吊的 WordPress 插件,这些插件至少都会兼容 SSL 。
这下,你的博客应该已经能够完美的显示出一个灰色的小锁啦!
唉?!为什么是灰色?知足吧,一类证书都是酱紫,想要绿色,请掏钱。
对了,在 Chrome 下是绿色了,但 Safari 比较挑,是灰色的~
另:如果你的博客包含了同域名下的非 HTTPS 链接,Chrome 会出现黄色的三角警告,而 Safari 则是像普通链接一样不在地址栏里显示小锁。