大概从 11 月 10 日起,我的文章就没有在 Google Reader 的订阅里更新过,而事实上我期间更新过两篇(包括两小时前发布的那篇文章)。最开始以为是 Google Reader 的间歇性抽风,没有太在意,直到今天发现半个月过去了,我的最新文章还是不能出现在订阅里面,而其它的订阅完全正常,这就说明问题出在我这里了。

在 Google Reader 里面添加一个新的订阅地址,这个博客的订阅地址是 http://xia.im/feed/,在地址之后加上随意的查询字符串,比如变成 http://xia.im/feed/?=123,这个地址能够打开 Feed ,对其内容也没有任何影响,但是这对 Google Reader 来说却是一个全新的订阅地址(我就碰到过此类问题,最开始我的博客上方的 RSS 链接忘记加反斜杠了,导致订阅地址既有 /feed/ ,也有 /feed,无形之中增加了 Fetcher 爬虫的抓取频率,同时也增加了服务器的压力...)。查看新的订阅,能够发现新文章,时间也正常,再使用 RSS Validator 验证了一下 Feed 的正确性,都没有问题。

我首先想到的是 .htaccess,因为之前我使用:

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://xia.im/$1/ [L,R=301]

这个规则,使末尾不带"/"的路径重定向到带"/"的路径。删除后依然无法更新。

然后,在 WordPress 的阅读设置更改 RSS 输出地最大数量大于已有的文章数量。在 Google Reader 里面刷新,无效。

上面两种方法都无效,但是仔细一看,订阅中其实出现了新的文章!只不过发布时间都在 11 月 6 日发布的文章之前,并且已被标注为已读。仔细观察了一下,这些新文章的发布时间居然是过去几篇文章的发布时间!想了想这段时间对 WordPress 的操作:我在 11 月 12 日备份了好几次数据库,那天我在精简数据库,并删除了几篇较老的文章,把 ID 重新排了一遍,为了看着舒服,还把 wp_post 表中的 guid 按照按文章 ID 重新对应起来。

因为之前操作过无数次重排文章 ID 的动作,并没有出现不能更新的问题,所以大胆猜测,是 guid 导致的 Google Reader 不能判断更新,对比了一下半个月之前的数据库备份,刚刚发布的文章 ID 为 64,时间被标注为 10 月 29 日,而 10 月 29 日那天发布的文章,ID 正好也是 64!也就是说我最新发布的文章,实际上在 Google Reader 看来,只不过是对已有文章的更新而已!所以没有出现在新条目列表,而被标注为已读!

查看 Feed 的 xml,上篇文章为例,有<guid isPermaLink="false">http://xia.im/?p=64<guid>,Google Reader 应该是根据这里判断是否为新文章。

在测试博客中调整 guid,能够重现和解决此问题。问题至此终于解决了,不过我不打算调整 guid,所以这篇文章可以看做是在刷 guid,嗯,还有一两篇文章发布后才能在 Google Reader 上继续更新。

注意:这个问题应该只在 Feed 输出限制数量时(比如设定 Feed 输出为三篇文章)才有可能发生,如果所有文章 Feed 输出,应该不会是这个原因。

  1. 我也是今天发现了这个问题,问题和博主的一样,但原因估计不是,还在找原因。。。

    • @老K博客
      我看了看,你的 RSS 是托管在 Feedsky 的啊,Feedsky 上的 RSS 都没更新。估计要么是 Feedsky 没有检测到更新,要么就是你的站点 RSS 输出或是地址有问题(这俩可能性不大)。抛弃 Feedsky 直接输出 RSS 或者用 Feedburner 应该不会出现问题了。

    • @小虾
      是域名重定向的问题,之前的 rss 链接在最后是没有 / 的,后来我为了实现把其他域名 301 重定向到一个域名,修改了 htaccess 文件造成了

  2. 原来是这么回事啊。。。。。学习了 :???: