修改腾讯公益404返回链接

了解腾讯公益404

腾讯公益404

为站点指定404页面

httpd.conf中找到子站点对应的VirtualHost,在里面添加一项

1
ErrorDocument 404 /404.html

即可指定404页面为站点根目录下的404.html

调整返回链接

如上官方页面所言,可以在调用js时传递站点链接来替换默认的返回地址,但我这样调用后发现返回链接仍然指向腾讯。于是查看源码,发现了这一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var homePageUrl, homePageName;
var scs = document.getElementsByTagName("script");
for (var i = 0; i < scs.length; i++)
if (scs[i].src.indexOf("/404/search_children.js") > -1) {
if (scs[i].getAttribute("homePageUrl"))
homePageUrl = scs[i].getAttribute("homePageUrl");
if (scs[i].getAttribute("homePageName"))
homePageName = scs[i].getAttribute("homePageName");
break
}
$scope.rettext = homePageName;
$scope.retlink = homePageUrl;
if (location.href.indexOf("fm.qq.com") > -1 || location.href.indexOf("fm.qzone.qq.com") > -1) {
$scope.rettext = "\u8fd4\u56de\u4f01\u9e45FM";
$scope.retlink = "http://fm.qq.com"
} else if (location.href.indexOf("qzone.qq.com") > -1) {
$scope.rettext = "\u8fd4\u56de\u6211\u7684\u7a7a\u95f4";
$scope.retlink = "http://qzone.qq.com"
} else {
$scope.rettext = "\u8fd4\u56de\u817e\u8baf\u7f51";
$scope.retlink = "http://www.qq.com"
}

可以看出,传递过去的值在执行过后面的if分支后,被替换成腾讯自家地址了,可能是某个粗心程序员修改时没有注意到这一点。
如何解决呢?

实际操作

修改404页面

1
2
cd hexo
vi source/404.html

之后于

1
</body>

前添加

1
<script type="text/javascript" src="/js/modify.js" charset="utf-8"></script>

保存并退出vim编辑器

创建modify.js

1
vi source/js/modify.js

写入内容

1
2
3
4
5
6
setTimeout(mod,"1500");
function mod() {
var desc = document.getElementsByClassName("desc_link")[0];
desc.href = "http://twodam.net";
desc.innerHTML = "回到博客";
}

保存并退出vim编辑器

1
hexo g d

重新生成并部署

简单讲解modify.js

这个js很简单,就是单纯的修改文本和链接。第一行是延迟1.5s处理,然后mod方法里通过class名获取对象,修改href和innerHTML也就是链接和文本。
href内填目标链接,innerHTML内填目标文本即可。
根据需要可以修改延迟的时间。

新的进展

更新自2018.03.17

最近发现这个问题修复了,还找到了在知乎上相关的讨论

代码方面,从之前的链接看过去,内容改为了

1
2
3
var _base = 'http://qzone.qq.com/gy/404/';
document.write('<script type="text/javascript" src="' + _base + 'data.js" charset="utf-8"></script>');
document.write('<script type="text/javascript" src="'+ _base + 'page.js" charset="utf-8"></script>');/* |xGv00|bb048611f4d0bb34934fd40353d94edf */

进一步的定位到新的page.js中相关代码部分,发现获取并设置返回链接的代码位置已经修复:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var homePageUrl, homePageName;
var scs = document.getElementsByTagName("script");
if (location.href.indexOf("fm.qq.com") > -1 || location.href.indexOf("fm.qzone.qq.com") > -1) {
homePageName = "\u8fd4\u56de\u4f01\u9e45FM";
homePageUrl = "http://fm.qq.com";
} else {
if (location.href.indexOf("qzone.qq.com") > -1) {
homePageName = "\u8fd4\u56de\u6211\u7684\u7a7a\u95f4";
homePageUrl = "http://qzone.qq.com";
} else {
homePageName = "\u8fd4\u56de\u817e\u8baf\u7f51";
homePageUrl = "http://www.qq.com";
}
}
for (var i = 0;i < scs.length;i++) {
if (scs[i].src.indexOf("/404/search_children.js") > -1) {
if (scs[i].getAttribute("homePageUrl")) {
homePageUrl = scs[i].getAttribute("homePageUrl");
}
if (scs[i].getAttribute("homePageName")) {
homePageName = scs[i].getAttribute("homePageName");
}
break;
}
}
$scope.rettext = homePageName;
$scope.retlink = homePageUrl;

而在官方的公益404页面中的js相关代码如下:

1
2
3
4
5
6
7
8
9
10
11
 for (var k =
f.head || f.getElementsByTagName("head")[0], c = {}, p, r, s, n, t, a = document.getElementsByTagName("script"), b = 0; b < a.length; b++)
if (-1 < a[b].src.indexOf("/404/search_children.js")) {
n = a[b].getAttribute("homePageUrl");
t = a[b].getAttribute("homePageName");
$scope.renderTarget = a[b].getAttribute("renderTarget");
break
}
$scope.rettext = t || (-1 < location.href.indexOf("qzone.qq.com") ? "\u8fd4\u56de\u6211\u7684\u7a7a\u95f4" : "\u8fd4\u56de\u817e\u8baf\u7f51");
$scope.retlink = n || (-1 < location.href.indexOf("qzone.qq.com") ?
"http://qzone.qq.com/" : "http://www.qq.com/");

很明显这个版本的代码也是没有问题的了。