这个博客自开始使用无限滚动至今已有好长时间了。最开始用的是 infinite-scroll 这个插件来实现无限滚动,这个插件有很长时间没有更新了,jQuery 在这期间都迭代几个版本了,作者大概也不想花心思在这个插件上面了,说实话尽管如此它仍能很好地忠于本职工作,最近偶然用了一次 IE8,无限滚动竟然不能正常工作了,这可不行。并不打算弄清楚具体是什么原因导致的了,只是想换一种实现方式。

于是,找到了 JScroll,这个比 infinite-scroll 要轻一些,功能和使用方法类似,有一个不好地方是 JScroll 在实现分页的时候会在每页容器内另加一层 div 包围,同时 IE8 上扔然有些小不完美,勉强也可以接受,在本地调试成功。谁知上传到服务器后特么的死活不滚了,还找不原因,看代码啥的也没问题,到底是肚子痛还是四肢麻木无从知晓,真是有缘无分(后来用了接下来的这个插件才找出来原因:问题出在 nginx 配置的一个插件的设置上),这给了我认识下面这个插件的机会。

周二晚上回家的路上,无意找到了 infinite ajax scrollgithub地址),简称 ias,这是个商业插件,非盈利性网站可免费使用,最新版本是v3.0.1,用法跟前面两个相似:

第一步:

1、下载 jquery-ias.min.js,把jquery-ias.min.js文件放到主题目录下的 js 文件夹里。

2、查看主题是否已经加载了 jQuery 库,如果没有那么打开主题目录下的footer.php文件,把下面一行代码粘贴在</body>标签之前,这是 cloudflare 免费提供的 jQuery 公共库,好处是支持 https:

<script type='text/javascript' src='//cdnjs.cloudflare.com/ajax/libs/jquery/1.11.1/jquery.min.js'></script>

3、接着加载jquery-ias.min.js:把下面一行代码放到上面代码的下面。

<script src="<?php echo get_template_directory_uri(); ?>/js/jquery-ias.min.js" type="text/javascript"></script>

第二步:

查看页面的 div 结构,目的是为第三步做准备:

<div id="content">
	<div class="post">日志一</div>
	<div class="post">日志二</div>
	<div class="post">日志三</div>
</div>
<div class="pagination">
	<a href="/page2/" >next</a>
</div>

第三步:

infinite ajax scroll 共有4个必要的配置参数,分别是:containeritempaginationnextdelaynegativeMargin可选,不建议修改)
并且需要和第二步 html 代码里的 id 或 class 做如下的映射关系方可正常工作:

container 对应 #content
item 对应 .post
pagination 对应 #pagination
next 对应 .next

映射完毕,得到如下的代码,放到第一步<script src="<?php echo get_template_directory_uri(); ?>/js/jquery-ias.min.js" type="text/javascript"></script>所在行的后面:

<script type="text/javascript">
	var ias = $.ias({
		container: "#content",
		item: ".post",
		pagination: ".navigation",
		next: ".navigation a",
	});
</script>

添加完毕,刷新一下即可无限滚动了。

这个插件还支持扩展

半自动加载,更改手动加载提示文字

启用后默认一滚到底,如果想搞点个性的也是可以的,如从第五页开始手动加载offset: 5,手动加载的提示文字为加载更多...,那么代码如下

ias.extension(new IASTriggerExtension({
	offset: 5,
	text: '加载更多&hellip;',
	html: '<div class="ias-trigger ias-trigger-prev bee"><a>{text}</a></div>'
}));

更改 gif 图片:

ias.extension(new IASSpinnerExtension({
	src: "gif图片地址",
	html: '<div class="ias-spinner bee"><img src="{src}"/></div>'
}));

更改末尾的提示文字:

ias.extension(new IASNoneLeftExtension({
	text: '已到结尾',
	html: '<div class="ias-trigger ias-noneleft bee">{text}</div>'
}));

把上面的扩展代码添加到第三步</script>前面就成了。

除了滚动日志列表,还可以滚动评论,滚动文章内容。

参考插件网站获取更多个性设置:http://infiniteajaxscroll.com

将 gif 转换成代码内嵌到代码中

上面更改 gif 图片时会用到 gif 的路径地址,特别是在 js 文件中是很不方便的,可以把 gif 图片通过 base64 编码转换成一串代码(data URI)内嵌到代码中,通过浏览器访问的时候,会把代码解读还原成图片,很方便,这里有一个在线转换服务,可以转换 JPG、PNG、GIF 或 BMP 格式的图像文件:
https://www.base64-image.de

优点:自然是免去更改文件位置带来的麻烦,减少 http 请求。
缺点:IE8 以下(IE6、7,不包括IE8)的浏览器不支持,IE8 只能支持最多 32KB 的 data URI。

上周启用了 https,昨天偶然使用 IE8 竟然打不开我的网站了,连链接都没有建立,刷新、清缓存、InPrivate 都不行,换 Chrome 也不行,还好 Chrone 有错误提示:
ERR_SSL_VERSION_OR_CIPHER_MISMATCH

唯有我常用的 Firefox 可以正常打开,忘了说,我的操作系统是 Windows XP。

我的主题对 IE 家族做了特殊照顾,向下兼容到 IE6,如果单单是 IE8 以下的浏览器打不开这还能接受,但是 Chrome 也打不开,这就不能接受了。Google 一下ERR_SSL_VERSION_OR_CIPHER_MISMATCH这个错误,在 nginx 网站找到一个答案,说要启用 SNI。然而,这并不是造成以上问题的原因,真正的原因是 cloudflare 的免费CDN 对使用 TLS 协议封装加密的 https 做了限制,要求客户端浏览器必须支持 TLS 的 SNI 扩展,而 XP 系统上 IE、chrome 都不支持 SNI。

SNI 是什么

简单来说 SNI 是 TLS 的一个功能扩展,有了 SNI 就可以在单个 IP 上启用多个 SSL 证书,现实一点说就是可以在只有一个 IP 地址的 VPS 上建立两个或更多的 https 网站了。

关于 SNI 这里有详细介绍:
http://blog.layershift.com/sni-ssl-production-ready

支持 SNI 的浏览器

当今地球上支持 SNI 的主流浏览器如下:

  • Opera 8.0 及更新版本;
  • MSIE 7.0(Windows Vista 或更新版本,XP 下的 MSIE 不支持 SNI);
  • Firefox 2.0 或使用 Mozilla 1.8.1 及更新平台的其它浏览器(的确牛逼);
  • Safari 3.2.1(Windows Vista 或更新版本);
  • Chrome(Windows Vista 或更新版本)。

详情请参见:
http://nginx.org/en/docs/http/configuring_https_servers.html

OpenSSL 对 SNI 的支持

OpenSSL 自 0.9.8f 开始支持 SNI(选配),选配参数--enable-tlsext
OpenSSL 0.9.8j 开始默认启用 SNI。

检测 nginx 是否启用 SNI

nginx -V
出现:
TLS SNI support enabled
即表明 SNI 已启用。

多个SSL证书报错

在有 SNI 之前,以往一个 IP 地址只能存在一个 SSL 证书,否则会提示证书错误。

cloudflare 的免费CDN 只适用于支持 SNI 的浏览器

用了 cloudflare 的免费CDN,速度确实快了很多很多,但是,上面说了 cloudflare 的免费 CDN 限制采用 TLS 封装的 https 只有在支持 SNI 扩展的浏览器才能正常访问。

表现为:

  • IE(6、7、8)无法建立连接。
  • chrome 提示:
    ERR_SSL_VERSION_OR_CIPHER_MISMATCH

本可以不对客户端的浏览器做 SNI 限制,这样做很大一部分原因可能是从成本或产品策略考虑。结合上面说的支持 SNI 扩展的浏览器,也就是说在 Windows XP 下的 IE全线、chrome 浏览器都无法通过 https 方式访问,这恰恰是企业无法忽略的。

这个不该成为问题的问题困扰了我两天时间,一直到当我怀疑这是 cloudflare 免费CDN的限制的时候,停掉 cloudflare 的免费CDN,问题才不解自破。

回头再看,cloudflare 的页面上有这方面限制的明确说明,只能怪自己做事不仔细。

如果同一服务器启用多个 https 网站后无法访问,可能有以下原因:

  1. 服务器只有一个IP地址(有多个IP需做配置);
  2. 服务器没有启用 SNI;
  3. cloudflare 的免费CDN 对使用 TLS 协议加密的 https 做了限制,要求浏览器必须支持 TLS 的 SNI 扩展。

还有多少人使用 Windows XP

有多少人使用 Windows XP 这个问题无从知晓,但Google 统计显示在访问我博客的Windows用户中,Windows XP约占36%,以实际访问量来换算,除了我自己之外,大概很少很少有其他人了,所以,目前不用急着去解决启用 SNI 后 Windows XP 的兼容问题。

同事的 iPhone 6 plus 屏幕摔坏了,虽然尚能正常显示,实际却已伤及内屏致使触摸失灵,不得不花钱换屏。本想搜索下就近提供换屏服务的维修点,谁知前排跳出来上门维修的信息,毫无疑问这是推广广告,还是电话过去:说明情况,得到报价,确认维修,约定时间。前后两分钟不到,一气呵成。

接近下午五点,同事的电话响了,无法完成接听操作,乖乖回过去,原来是早上约的维修人员按时上门…

架上行车记录仪,摆好工具,开始询问和检测手机,说明保修政策和范围(所换屏幕非人为损坏一年),拆-换-测-装,搞定,同事检查确认没问题,总费用530,支持现金、支付宝和微信付款,付款后给了凭据,转发一条他们上门维修手机的微博,可以免费给屏幕贴膜,同事死皮赖脸不肯发,那小哥也没强求,还是免费贴了。

维修过程中我们跟维修小哥交谈,他在这家手机维修公司上班,专修苹果手机,平均每天要修6部手机,各种问题都有,多半是屏幕故障。这次换的屏幕不是原厂的,是他们公司认证的屏幕。也提供内存升级128G服务,因条件限制无法上门,必须回公司完成。

维修小哥在认真检查手机
维修小哥在认真检查手机

这次手机维修,从上门到离开,前后不到四十分钟,500块到手,一天修6部,我都想去学修手机了。乔布斯的伟大之处在于不但能让自己的企业赚大钱,同时还能让周边产业人员赚大钱,这是核桃终结者诺基亚所不能及的。

这位同事是去年购买的这部 iPhone 6 plus,至此已是第三次人为损坏,三次全是换屏,第一次换屏花费1400元,第二次换屏400+(维修小哥拆机时发现第二次换的屏质量不行),加上这次的维修费,这部 iPhone 6 plus 已经让他花掉一万块钱了。

算完上面这笔帐,我毫不犹豫地电话购买了 Apple care+ 服务。

事情是这样的,一个自称黑客的人(下称黑客),以掌握受害人的个人隐私信息为由,胁迫被害人交出指定的帐号信息,否则将公布被害人的个人隐私。受害人被迫到社交网站求助,热心网友利用受害人提供的线索帮忙把黑客的个人信息翻了个底朝天,成功反攻。

求助

受害人受到威胁后在 v2ex 发帖求助,摘录原帖部分内容:“这个人看中了我的百度中文帐号,号称手上有我的个人信息资料,拿百度帐号换就可以从他们社工库里面清除。感觉非常无语,一看发过来的都是 163 邮箱泄漏的,不知道还有多少人要中枪。”

反击

受害人在帖子上提供了跟黑客的 QQ 聊天截图和黑客的 QQ 号码。这个黑客很不聪明,使用了自己的常用QQ,小看互联网这个开放的大数据中心了,too young, too simple!

互联网上热心、正义又有能力的人很多,首先,一位义士通过社工工具库找到了几条线索,有黑客的班级 QQ 群、几个论坛的账号信息,初步识别了黑客的几项个人信息。

接着,顺藤摸瓜,利用 QQ 号码又扒出了黑客的出生日期、微信账号、地理活动范围以及黑客在百度贴吧的活动情况,只需在百度搜索框粘贴一下黑客的 QQ 即可得到贴吧上这些记录。这个黑客在百度贴吧很活跃,有多个贴吧账号,曾多处多次在贴吧暴露这个 QQ。

好人做到底,继续顺着贴吧上的线索很快又扒出黑客的微博信息,可笑的是这个黑客竟然把个人照片贴在百度贴吧上,目的是交往异性朋友,猜测多半是想守株待兔骗女孩子的,请原谅,我实在不敢像想象正常人那样来想象这个人。

再回到微博这条线,打开,嗯,经常在某地活动,只要对带地理位置信息的微博内容和发布时间稍作分析,不难猜测,这个区域大概就是这位黑客的主要活动区域,好了,打到了赤月魔穴,根据地被扒出来了。

论坛上更多的热心人加入进来,有看热闹的,也有出工出力的,有人声称查到:身份证、淘宝店、支付宝账号、 steamID 、常用 IP 地址和微信号等信息,不过没有公布出来,很快又有人扒出黑客所从事的行业和电话号码。

有看热闹的不怕事情大,有人利用扒出来的信息联系并调戏了黑客,黑客意识到 something is coming. 很快改了 QQ 的主显示号码,可笑的是这样的做法只是火上浇油:他把 QQ 主显示账号改为了个人手机号码,正好验证了前面扒出的手机号码。

如果研究下黑客在其他论坛的活动情况,应该能够确定更多信息。

结局唏嘘

到此黑客彻底被打垮,投降了,但是,并非无条件投降,黑客再次联系上受害人,这次是替他“朋友”“道歉”。什么?!对,黑客说这事是他朋友借用他QQ账号干的,跟他本人无关,替他朋友有他这么一位93年出生的好朋友而高兴。

这位年轻的黑客被揭穿后,非但没有惊慌失措和迟疑,反而立马撒谎狡辩,经验老道、心理沉着,可见类似这样的坏事不是头一次干了。跟参加讨论的部分网友观点一致,我也深信这件事肯定是他本人所为,也不相信经过此事后他会有任何悔意,也许很快就会有一个倒霉蛋成为他的下一个攻击目标,也许这一次他已经是带着从上一个倒霉蛋那里获得的成功的自信而来,谁知道呢。

这不是乱编的故事,感兴趣,想练练手,请移步这里观摩整个事件的来龙去脉(目前已做限制,需要登录才能查看了,不想登录请看截图:图一图二)。

还敢随便暴露个人信息吗。

哈哈,等了好久终于等到了你,Firefox 今天正式登陆 iOS 平台:
相比测试版,这次正式版除了 bug 修复,还加入了 Firefox 账户系统和隐私浏览模式。