本博客创建之后针对Typecho做的代码修改

我在2016年12月29日晚购买主机之后,主机商问我想要安装哪款程序,我说zblog吧。当时我已经厌烦了wordpress的臃肿,虽然我2014年以后就没有再用wordpress。根据目前wordpress的4.8.1版本,解压出来要26.1M(Linux显示的数值和Windows会有差别,26.1M是Linux下的数值),虽然我不懂php,但可以想象它运行起来会消耗掉多少资源,对博客访问和读写的速度又会影响多大呢。当天晚上不知道是什么原因,zblog管理上很不顺畅。第二天我无意间看到了一位微博博友的独立博客,发现他用的是Typecho,然后我也下载并安装了,从此踏上了Typecho的不归路。下面介绍迄今为止本博客自创建之后所做的代码修改。

1 主题模板

Typecho安装之后,我开始不断安装各种主题,直到今天我还在测试下载到的主题。关于主题,Typecho下的主题不少,而我又是那种有强迫症的人,对主题挑三拣四,同时还要自己对其进行修改。我是外行,对php这东西完全不懂,而我只能靠这些年折腾独立博客积攒的经验,来对博客主题进行适当的修改。这个过程中,完全由试错进行。因为我看不懂代码,只能凭借comment、sidebar这些英文单词猜测那段代码是什么意思,根据页面显示出来的文字、效果等推测部分php代码是什么意思。如果需要添加代码时,我把代码放在不同的位置测试页面显示效果。这里必须重点提的是:我完全看不懂css代码,折腾博客这么多年我一直都看不懂。

对于主题的设计者,我非常敬重,对于这些计算机高手我非常佩服。在作者的允许之下(我主要看主题介绍页面,作者会明确提示该主题是否允许修改),我对主题进行少量改造。根据Typecho的不同组建代码进行综合,再根据html代码查找,我为博客添加了版权协议说明代码,如下:

    <blockquote>
本作品采用<a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/3.0/cn/"; target=_blank>知识共享署名-非商业性使用-禁止演绎 3.0 境内许可协议</a>进行许可。
<br/>
转载请注明:转自<a href="<?php $this->options->siteUrl(); ?>"><?php $this->options->title() ?></a><br/>
原文链接:<a href="<?php $this->permalink() ?>"><?php $this->permalink() ?></a>
</blockquote>

这里面的html代码部分,根据官方提供的代码,手动添加了target=_blank,以实现新窗口打开。

修改部分主题的显示效果。比如我今天(2017.10.21)更换的主题,添加上述代码后,会造成“本作品采用知识共享署名-非商业性使用-禁止演绎 3.0 境内许可协议进行许可”这句话与下方的“上一篇、下一篇”紧贴在一起,看着不美观。经过测试,我在上述代码之后,添加了如下代码:

<br/>
<br/>

这样显示的就美观了。

同时我也会少量修改其他文件,完善显示内容。对于部分代码,无论我如何修改,就是无法显示想要的效果。我搜索一下,网上说需要修改css,遇到这种情况我就放弃了。

当然,有些主题设计的并不好。部分主题不支持评论嵌套,部分主题不支持评论框,部分主题作者添加了很多自己的信息,在别人使用这个主题后无法更改,比如各种logo。有的主题使用了Google fonts,导致博客打开超级慢,需要等待5分钟左右。如果你说,你既然不满意就自己改啊。那么,请阅读本小节的第一个自然段。

2017年11月14日更新:由于本博客不同博文采用不同的版权要求,所以我去掉了这段代码。

2 新窗口打开链接

Typecho 1.0版本中,除了手动添加target=_blank的html代码可以实现新窗口打开,其他代码均为原窗口打开。这样如果一位读者阅读我的文章时,看到我引用的超级链接并且点进去了,那么可能就回不来了。所以我要实现新窗口打开。从网上检索到了一些帖子,其中小z博客给出的方法有效。根据其介绍的方法,需要进行如下操作:

找到/var/CommonMark/HtmlRenderer.php这个文件,在105行,也就是$attrs['href'] = $this->escape($inline->getAttribute('destination'), true);之后添加如下两行代码:

$attrs['target'] = $this->escape(_blank, true);
$attrs['rel'] =$this->escape(nofollow, true);

修改后的完整代码如下:

    case CommonMark_Element_InlineElement::TYPE_LINK:
$attrs['href'] = $this->escape($inline->getAttribute('destination'), true);
$attrs['target'] = $this->escape(_blank, true); //typecho 1.0文章内连接新窗口打开
$attrs['rel'] = $this->escape(nofollow, true); //typecho 1.0文章内链接加上nofollow
if ($title = $inline->getAttribute('title')) {
$attrs['title'] = $this->escape($title, true);
}

这样就OK了。但是却无法实现评论中的链接新窗口打开。下面介绍如何使评论中的链接在新窗口中打开。

2017年11月14日更新:本文件在1.1版本中已经不存在。
2017年12月11日更新:有高手开发了新窗口打开插件

3 评论链接新窗口打开

根据挨踢路提供的方法,找到var/Widget/Abstract/Comments.php,在里面找到如下代码:

echo '<a href="' , $this->url , '"' , ($noFollow ? ' rel="external nofollow"' : NULL) , '>' , $this->author , '</a>';

然而,他提供的修改后的代码在我这里执行错误,于是我对这段代码进行新的修改,经过不断的测试,最终修改如下:

echo '<a href="' , $this->url , '"' , ($noFollow ? ' rel="external nofollow"' : NULL) , ' target="_blank">' , $this->author , '</a>';

4 开启全站HTTPS

开启HTTPS是未来的趋势,因为目前很多浏览器均对不加密的HTTP进行警告,因为HTTP未经加密,会被窃取重要资料,包括账号、密码、信用卡账号、电子邮件等。目前Let’s Encrypt和SSL For Free均提供了免费SSL证书,所以个人站长有福气了。这要感谢我的微博博友Victorika233告诉了我这个免费的SSL。

按照SSL For Free的引导,申请并获得证书,且在虚拟主机控制面板上安装SSL证书后,需要对站点进行更改。

首先,将站点的文件从public_html转移到private_html,然后,根据小z博客的介绍,在Typecho站点根目录下的文件config.inc.php文件中,加入了如下代码:

/* 开启HTTPS /
define('__TYPECHO_SECURE__',true);

注:1.1及以上的版本已经不需要配置这个了,直接可以支持HTTPS。

然而我发现,Typecho 1.0自带的主题,在HTTPS下,Firefox提示页面中含有不安全因素。小z博客那篇文章里提到了以下情况:

由于Chrome浏览器对HTTPS要求较高,Firefox已经显示小绿锁,可是Chrome还是有警告提示,F12查看,评论表单的action地址还是HTTP,找到站点主题目录下的comments.php文件,并搜索$this->commentUrl(),将其替换为:

echo str_replace("http","https",$this->commentUrl());

这个修改方法在一个论坛上也出现过,然而,在我这里却是无效的,Firefox下还是提示页面含有不安全因素,上面的绿锁还是会有一个感叹号。从网上查到各种帖子,均无法解决这个问题。

这时候我发现typecho的开发版中,主题有修改记录,于是我将开发版中的默认主题(版本:1.2)下载安装,发现这个问题已经修复了。随后我用了很长时间,直到最近又突发奇想更换了其他主题。

注:1.1及以上的版本已经不存在这个问题了,直接可以完美支持HTTPS。

5 将HTTP转移到HTTPS访问

浏览器输入网址后,默认是HTTP访问,这时需要将其跳转到HTTPS。试验了各种方法,其中网上提供的一个方法有效,可惜忘记保存出处,在这里向原作者致歉。

在public_html目录下,新建.htaccess文件,写入如下信息:

RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$ RewriteRule (.) https://%{SERVER_NAME}/$1 [R]

这样就可以直接302跳转了。个别主机不支持,可以配置301,在根目录该文件最头部写入如下代码:

RewriteEngine on
RewriteBase /
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^.$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

6 防止图片盗链

我一直没有往空间里传图片,都是用的图床。最近img.co图床被干掉了,本站链接的图片全部无法显示,因此还需要自己上传。这样的话,以后如果更换了主机,那么需要连图片一起转走。2013年我用的主机被关闭,幸好在此之前有数据库备份(但不全),我将数据库上传到了网易LOFTER,恢复了大部分文章(少部分上传后被LOFTER屏蔽了),但是图片全没了,因为主机被关闭是突然的,我没有来得及备份。在此多说一句,上次主机被关闭,不是主机商跑路,而是主机商租用的整台服务器被服务器商收回了,导致那几台服务器上的所有站点全部挂掉了,包括主机商自己的站点。当时主机商跟我道歉了,并且让我主动迁移站点。

但是由于种种原因,我目前只能自己上传。自己上传的话,被盗链是可怕的,会导致流量增高。因此需要防盗链。网上有人提供了方法,但部分方法会导致本博客访问出现问题。经过不断测试和修改,综合琥珀主机帮助中心SJY之家提供的方法,在站点文件存放的根目录下的.htaccess文件中,添加如下代码:

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteCond %{HTTP_REFERER} !****.com [NC]
RewriteCond %{HTTP_REFERER} !baidu.com [NC]
RewriteCond %{HTTP_REFERER} !Google.cn [NC]
RewriteCond %{HTTP_REFERER} !feedburner.com [NC]
RewriteRule .*.(gif|jpg|png|bmp)$ http://typecho.org/usr/themes/bluecode/img/screenshot/st1.png [R,NC,L]

经测试有效。在其他博客引用本站图片时,就会变成引用typecho.org主页的那张图片了。

7 开通评论邮件通知

这个请阅读我的上一篇文章《本博客开通评论邮件通知的始末》

8 存在的问题

目前发现,typecho下博文的{cid}不会连续。举例来说,发表了其中一篇文章,{cid}数值是23,如果我修改了这篇文章两次,那么再发表新文章时,{cid}就是26了。而且有时候还是不连续递增,比如中间只修改了两次,但是下一篇可能跳过了十几个数值,比如从114直接变成133。这个问题我不知道如何解决,也许这就是作者有意这样设计的吧。当然这个不影响博客的正常访问,也许等{cid}变成六位数以上的时候,已经是很多年以后了。

2017年11月18日更新:目前该问题阶段性解决,解决方案见:《解决{cid}不连续问题&搭建私人图床》

以上就是本博客建立之后到现在的10个月时间,对博客的访问、typecho及所使用的主题进行的有关修改。如果对你有用,就是我最大的欣慰。感谢广大网友对建站有关技术的无私分享,感谢帮助过我的博友,是你们的帮助才让我的博客有了今天。同时希望各位独立博客的站长们,多多来我的博客坐坐,并留下你的足迹。同时欢迎与我交换链接,常来常往。

2017年10月21日初稿
2017年10月22日修改几处错误

30 条回复

山野愚人居 2017年10月22日 回复

cid不连续是因为开启了草稿功能,后台关闭草稿就可以了!

林海 2017年10月22日 回复

草稿功能是不是“自动保存”?我已经关闭了“自动保存”,后期观察效果。

林海 2017年10月22日 回复

猫猫,常来看看~

斑猫 2017年10月22日 回复

:期待回访哦

保罗 2017年10月22日 回复

cid 默认是连续的,你看到的是文章附件吧… 楼上提到的草稿功能 TC 是有的,但默认安装好像是关闭的

林海 2017年10月23日 回复

有可能,我查过TC的论坛,cid会被页面或附件占用,而且修改一次都要占用,所以我推测了一下,当我编辑了页面、保存了草稿、修改了文章,都会占用一个新的cid,这才导致它中断的那么厉害。

莫白 2017年10月23日 回复

竟然看完了,以梦为马,奔向远方,加油!博主是学什么专业的!

林海 2017年10月23日 回复

我是学动物医学的,冷门专业。谢谢你的鼓励,欢迎常来看看!

小F 2017年10月23日 回复

cid不连续应该是草稿的关系吧?我以前用TP的时候没有这个问题……
但是用“编辑文章”页面里的上传图片功能的话,一张图片会占据一个CID号码,所以我后来都不在TP里上传图片了!

林海 2017年10月24日 回复

我觉得草稿、附件、而且修改了文章或页面,都会占用cid。修改后的文章虽然还显示原来的cid,但是已经占用了新的cid了。

小F 2017年10月24日 回复

那我就不知道了!我以前用的时候没有这个问题,无论编辑修改多少次下一篇新日志的CID还是连续的,只要不上传附件和新建页面。

林海 2017年10月24日 回复

那难道是修改过程中的草稿原因?等我再发文章时观察测试一下……

黑暗游侠 2017年10月23日 回复

cid不连续其实也没多大影响,除了强迫症和一些文章内容调用

林海 2017年10月24日 回复

对,实际上就是强迫症。但后来看,觉得没什么。不会有人用它来判断我到底写了多少文章,哈哈

明月登楼学习笔记 2017年10月24日 回复

最后的文章ID不连续好像是所有博客平台的“通病”吧,不过,这个也就是给搜索引擎用的,真心无所谓的!

林海 2017年10月24日 回复

我印象是,记得wordpress也有类似的情况。实际上这个就是强迫症,不会有人根据cid判断我写了多少文章,只是一个固定地址而已,只要强迫症不犯病就好。。

fooleap 2017年10月25日 回复

自从 n 年前用上 Jekyll 之后就没有 ID 号的概念了,还是静态博客简单~

林海 2017年10月25日 回复

当然啦,我曾经也在github弄过jekyll。那时候我用的是disqus。现在作为门外汉的我,先折腾折腾,哈哈,成功了再转移。

太阳雨 2017年10月26日 回复

升级后第一段代码出错了

林海 2017年10月26日 回复

是的,我这就提交上去

老虎 2017年10月27日 回复

php学学也不难的。

林海 2017年10月27日 回复

我真的想学……

发表回复