网站收录上不去,先看看你的服务器时间对不对

· zblog · 阅读 2
摘要

听起来很偏门,但我真遇到过。现象sitemap 里所有 lastmod 的时间,比实际发布时间早了八个小时,还有一些比当前时间还晚。文章列表页的时间显示也乱。原因服务器时区设置成了 UTC,而 Z-Blog 里配置的是 Asia/Shang

听起来很偏门,但我真遇到过。

现象

sitemap 里所有 lastmod 的时间,比实际发布时间早了八个小时,还有一些比当前时间还晚。文章列表页的时间显示也乱。

当时的第一反应是插件有 bug,翻了两天代码没找出来。后来在服务器上敲了一行 date,才看到系统时间比北京时间慢八小时——那一刻挺想笑。

原因

服务器时区设置成了 UTC,而 Z-Blog 里配置的是 Asia/Shanghai。PHP 输出的时间被反复加减,最终写进 sitemap 的就是错的。

细节是这样的:文章入库时存的是时间戳,理论上是时区无关的。但如果某个环节用了 date() 格式化再解析回时间戳,中间就会串味。多语言站或装了多个插件的站,这种问题更容易出现。

影响

搜索引擎判断内容的新鲜度靠这个时间。时间错乱,新文章可能被当成老文章,老文章被当成未来内容直接忽略。

「未来内容」这一点尤其严重。如果时间戳比当前时间还晚,搜索引擎会认为这个页面还没上线,暂时不进索引。它要等你那个时间到了才来抓——而那个时间可能在一个月后。

我那次看到的情况是:索引量正常,但新发文章普遍要三周才被收录。原因就在这里。

检查方法

在站点根目录放一个 time.php,输出 date('Y-m-d H:i:s'),和手机时间对一下。

<?php
header('Content-Type: text/plain');
echo 'PHP: ' . date('Y-m-d H:i:s') . "\n";
echo 'TZ: ' . date_default_timezone_get() . "\n";
echo 'TS: ' . time() . "\n";

看完记得删掉这个文件,别留在线上。

修完

把 php.ini 的 date.timezone 和 Z-Blog 后台的时区设置统一成 Asia/Shanghai,然后重新生成 sitemap。

两处都要改,只改一处不够。php.ini 是 PHP 的默认时区,Z-Blog 后台是应用层的设置,应用层会覆盖默认值,但插件里直接调 PHP 函数的地方可能绕过应用层,所以两边统一最稳。

改完重新生成 sitemap,再抓一份看 lastmod 是否正常。如果还不对,检查数据库里存的时间戳本身是否正确——如果入库那一端就错了,改时区也只能保证新数据正确,旧数据要单独修。

顺手一提

顺便检查一下后台「设置 › 全局设置」里的时间显示、评论时间、RSS 输出的时间是否一致。如果只有 sitemap 一处乱,说明是生成器的问题;如果多处都乱,那就是全局时区没对齐。