前几天把 Blog 搬到了 Rainice 的 Linux 主机上,结果导致形如 http://rainux.sefans.com/blog/wp-trackback.php/67 的默认 TrackBack URI 无法正常工作。Rainice 猜测是 Apache 的 mod_rewrite 模块禁用造成,不过我在自己的 Windows 主机上禁用 mod_rewrite 后这个 URI 一样可以正常的工作。

Rainice 提议说可以把 URI 中最后一个 / 改成 ?。通过分析 WordPress 的源代码,打开 wp-trackback.php 和 wp-includes\template-functions-comment.php 修改后却仍然无法使用。因为 TrackBack 是以 POST 方法发送的,比较难调试,只好自己写了个简单的 PHP 页面来辅助调试。

$handle = fopen('post.txt', 'a+');
obstart;
printr($POST);
printr($SERVER['REQUESTURI']);
fwrite($handle, obgetclean());
fclose($handle);
目的很简单,就是把 POST 过来的数据和请求自身的 URI 保存到文件里以便观察。

几经周折,终于发现是因为 wp-includes/functions.php 里的 trackback() 函数在组织 http request 时没有正确处理带有问号的 URI 造成的。

$http_request  = 'POST ' . $trackback_url['path'] . 
                 $trackback_url['query'] . " HTTP/1.0\r\n";

很显然经过这么一拼凑 TrackBack URI 中的问号就被处理掉了一个。

正为发现一个 WordPress 的 bug 而窃喜准备去 WordPress 论坛报告时,才发现 1.5 beta 版里这个问题已经被修正了。

可叹平常我都对软件的追新乐此不彼,还时常以“新功能”、“就算用不上新功能,Bug 修正也是很重要”之类的理由“引诱”朋友也尽力使用新版本的软件,没想到今天自己居然因为一时偷懒没升级 WordPress 而吃了大亏,白白浪费了几个小时来除错,唉!

要修改的地方有 wp-trackback.php 第 6 行附近

// 修改 / 为 ?,在 mod_rewrite 禁用的情况下正常使用
//$tb_id = explode('/', $_SERVER['REQUEST_URI']);
$tb_id = explode('?', $_SERVER['REQUEST_URI']);

wp-includes\template-functions-comment.php 第 266 行附近 trackback_url() 函数中

// 修改 / 为 ?,在 mod_rewrite 禁用的情况下正常使用
//$tb_url = get_settings('siteurl') . '/wp-trackback.php/' . $id;
$tb_url = get_settings('siteurl') . '/wp-trackback.php?' . $id;

wp-includes\functions.php 第 562 行附近 trackback() 函数中

// 此处修改保证带有问号的 URI 能正确处理
//$http_request  = 'POST ' . $trackback_url['path'] . 
                   $trackback_url['query'] . " HTTP/1.0\r\n";
$http_request  = 'POST ' . $trackback_url['path'] . 
                 ($trackback_url['query'] ? '?' . 
                 $trackback_url['query'] : '') . " HTTP/1.0\r\n";

OK, Good job! 不过我很郁闷 :(

Tags: ,

7 Responses to “搞定一个 1.2 版中的 TrackBack 的问题”

  1. 子游 Says:

    非常感谢,已经按你的方法改好,并测试成功。
    只是因为我的风格,“本文的引用网址(TrackBack URI): http://rainux.sefans.com/blog/wp-trackback.php?71 ”这句话在我的BLOG中没有直接显示出来,怎么添加?在哪个文件哪个位置。直接显示出来便于使用啊

  2. Rainux Says:

    不用客气,呵呵。
    看了一下,你那个好像是使用了 1.5 的 Theme 吧?下面有类似这样一段话。
    This entry was posted on Tuesday, 一月 18th, 2005 at 9:22 am and is filed under 务虚笔记. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
    最末尾那个 trackback 是一个链接,地址就是 TrackBack 的 URI 了。
    如果要修改,可能要从你的 Theme 里入手了,你可以试试在 Blog 源代码里搜索一下上面那段话里的某些词。

  3. 子游 Says:

    谢谢,搞定。

  4. 子游 Says:

    1.5版还是存在这个问题,是不是还得这样改?

  5. Rainux Says:

    你用的哪天的版本?我记得上次下载的最近一天的版本,trackback() 函数已经没有问题了,但是前面那个斜杠的问题依然存在,在某些服务器上仍然无法使用类似 http://xxx/yyy.php/1 这样的 URI,所以还是得改。

  6. 子游 Says:

    25日的版本,我已经改好,谢谢。

  7. windix Says:

    这个确实和mod_rewrite什么关系都没有:)
    经过我的确认,应当是Red Hat AS 自带的Apache问题。我比较了一下它的配置文件和Apache默认的配置文件也看不出什么来,不过我升级了sefans上面的Apache之后就搞定了。现在sefans上面的Apache和PHP已经都升级到了最新的版本了,都是我从源码直接编译的。
    我现在也转向WP了:P 看你弄的挺不错,有空多多交流。我记得我MSN里面有你的,不过怎么找不到了?
    我的MSN: windix#hotmail.com

Leave a Reply