MENU

博客SSL化已完成90%

December 24, 2016 • 网络技术

对于emlog来说,目前最新的正式版本5.3.1版对SSL的支持是不好的,而6.0版本除了一年前的那个测试版外就再没有更新了。

我的感觉是官方开发组已经放弃了继续开发,当初的热情已经消耗殆尽了,如果大家要搭建博客或者做站,基本上不要再考虑emlog比较好。

虽然emlog落后了,但是当前从空间主机服务商到比如苹果公司(从2017年开始iOS系统的APP必须走ATS),都在极力的推广SSL。所以,现在个人博客也是时候换成https了,正好我的空间商送了个证书,虽然本来就是Let's Encrypt的免费证书,但能用就行了!

对于证书的申请与安装,百度里就能搜到很多,我这里就略过不说了,我想说的是当证书设置完毕后,咱们需要做的。

这个时候,我们可以访问网站,但是地址栏前面是不会出现安全锁的标志的。因为我们通过F12可以看到,其实当前页面里有很多错误。

点击查看原图

没办法,只要有一个资源是走的http,安全锁的标志就都不会出现,所以我们要把这些错误都解决掉才行。

首先是我们可以看到那些css什么的文件路径,这是因为我们没在emlog后台将博客主页地址设置为https导致的,设置后可以解决。

之后,是我挂在侧边栏的微博widget,垃圾微博,没有https支持,所以果断去掉。

ssl02.png

然后可以看到其中一个错误是

ssl03.png

这是emlog自带日历的问题,如果你有开启日历,应该可以看到它一直显示加载中。

解决的方法是找到:/include/lib/function.base.php
将第73行改为:

return '//' . $_SERVER['HTTP_HOST'] . $matches[0];

就是把http://改成//,这样它就会自动判断是http还是https了。

 

剩下的,还有就是我在模板里面加入的CNZZ统计代码和IPv6的那个支持标志代码,直接将http改成https就行了,但是IPv6那个有个图标资源通过https获取不到,比较科学的做法是,直接把这个标志删掉。

ssl04.png

改完了这些,也在后台设置了主页地址是https,那么此时应该已经大幅减少了报错信息了。

剩下的问题,有一个是在我们日志中的图片附件地址都是http,这个会报错,解决方案是通过修改数据库来实现,将数据库里emlog_blog表里的content字段的内容进行批量查找替换,将https://www.jevin(请你在输入代码时将地址换成你自己的域名)全部替换成https:// www.jevin 。

对应到命令就是:

UPDATE emlog_blog SET content = replace(content,'https://www.jevin','https://www.jevin')

这是一个解决办法,但并非最优解决方案,因为如果以后我要回到http,或者整体换了程序默认没有开启http,可能会导致https的附件链接出现问题。

 

所以我到目前为止没有做这个事情,也只能将博客的SSL化停留在90%的进度上。

基本上按照上面的操作了之后,我们再看就不会有报错了,安全锁的标志也应该出现了。如果还有报错,请根据错误提示,寻找对应的解决方法,其实都是链接上的事情,还是比较容易解决的。

下面要说一说我遇到的另外一个问题,我的模板有字符图标,切换完毕之后,这个字符图标只能通过https进行访问,如果走http则会报错:

点击查看原图

这是由于跨域请求被禁止掉了,我在网上搜了一下,了解了这个问题之后,脑袋里列出了3种解决方案:

方案一:请求模版作者或者自己为.eot、.ttf和.woff等字体文件的响应头中加入

Access-Control-Allow-Origin: *

这个命令会使字体文件允许跨域请求。

 

方案二:这个方案来自腾讯isux团队的博客

通过服务器配置允许字符图标的字体文件进行跨域请求。

# For Apache
<FilesMatch ".(eot|ttf|otf|woff)">
Header set Access-Control-Allow-Origin "*"
</FilesMatch>
# For nginx
location ~* \.(eot|ttf|otf|woff)$ {
add_header Access-Control-Allow-Origin *;
}

这个办法需要配置服务器才行,而我博客因为想尽可能的少折腾,所以用的虚拟主机,显然我自己是无法配置的,于是提交了工单到空间商那边,截止我发文时,尚未给出明确回复。

 

方案三:这个方法最简单也最适合小白,换个模板就行了,只要模板没有跨域的资源请求,那么问题自然就不存在啦!

 

按照我自己的选择,我肯定是选择方案三的,但是在跟朋友说起这个问题的时候,朋友直接跟我说从源头解决,应该是可以直接在emlog的程序代码上解决掉的。经过多次询问,最后朋友直接帮我搞定了,即找到网站根目录下init.php文件

将第33行:

define('BLOG_URL', Option::get('blogurl'));

修改为:

//define('BLOG_URL', Option::get('blogurl'));
$real_url  = $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://';
$real_url .= $_SERVER["SERVER_NAME"];
define('BLOG_URL', $real_url."/");

这个方法,是从整个程序最早确定博客地址的地方入手让后续所有工作都统一到一个域去进行,自然就不会存在跨域请求的问题了。

点击查看原图

至此,我的博客除了附件文件在文章里插入的链接以外,基本就没有其它问题了,从整个进度上来说就差最后一行代码就可以百分百跨入SSL,但我还在犹豫,所以在我决定之前,就让它停留在90%的SSL完成度吧!

Archives QR Code Tip
QR Code for this page
Tipping QR Code