您的位置: 首页 / PHP / WordPress 2.0.1 URL Rewrite Bug

WordPress 2.0.1 URL Rewrite Bug

Published at Feb 8, 5pm / Keywords: ,

WordPress 作为最出色的 PHP 平台 Blog 系统被广泛使用。前几天,WP 发布了 2.0.1 版,号称修复了 114 处 Bugs。我这里也换上了这个版本。虽然我不太了解具体这 114 个 Bugs 都是什么,但今天在 BunnyQ 的提示下确实发现了一个 Bug。

简单描述一下问题。WordPress 有一个功能叫固定链接(或永久链接),就是将 index.php?aaa=bbb&ccc=ddd 这样的链接改写成比较好记或容易被搜索引擎收录的形式。在有 apache_mod_rewrite 的支持下,wp 可以将链接彻底重写为 yourblog/xxx/yyy 这样的形式,而在没有 mod_rewrite 支持下,wp 会利用 PHP 自身的环境变量来模拟重写,生成地址为 yourblog/index.php/xxx/yyy 这样的形式。在 WP 2.0.1 版本中,如果您的 Blog 是后一种情况(即无 mod_rewrite 支持),则会出现问题,当您访问 yourblog/feed 时,会返回 yourblog/comments/feed 的结果。

根据现象,初步可以判断是 rewrite 规则的问题。WordPress 中处理 rewrite 的部分主要在 wp-includes/classes.php 文件中。Class WP_Rewrite 这个类是用来生成 rewrite 规则的,WP类中 parse_request() 函数是用来解析请求的。经过设置断点分析,问题出在生成规则的 WP_Rewrite 类中,在 /(feed|rss2|rss|atom|rdf)/?$ 这样的匹配规则中,在生成请求时都错误的加上了 &withcomment=1 这个条件(另外还有一条类似规则也有这个问题)。但是看来看去也没看出生成规则的函数 rewrite_rules() 和 generate_rewrite_rules() 有什么问题。无奈拿来 WordPress 2.0 的代码对比来看,发现在 2.0.1 版本中数组连接使用了 array_merge 函数,而不是 2.0 中的 +。难道这是问题吗?于是将 1345 行进行如下更改:

rules = array_merge($page_rewrite, $root_rewrite, $comments_rewrite, $search_rewrite, $category_rewrite, $author_rewrite, $date_rewrite, $post_rewrite); //原来的代码
$this->rules = $page_rewrite + $root_rewrite + $comments_rewrite + $search_rewrite + $category_rewrite + $author_rewrite + $date_rewrite + $post_rewrite; //新代码
?>

测试,竟然生成了正确的 rewrite 条件!查阅 PHP 手册,明明写着只有“字符串键名相同,后一个值才会覆盖前一个值”。可这两组键名绝对不一样呀!看来这不是 WordPress 的 Bug,而是 PHP 的 Bug。我测试用的 PHP 版本为 4.4.1,不知道换上最新的 4.4.2 或 5.1.2 是不是就没问题了。

好了,最后给出解决方案。按照上面代码将 wp-includes/classes.php 1345 行修改,然后用 phpMyAdmin 之类的工具在您的 WordPress 数据库中执行下面的 SQL:

UPDATE wp_options SET option_value = “” WHERE option_name = ‘rewrite_rules’;

做好以上两步后访问一下你的 WordPress,让它重新生成重写规则,问题解除。

发表您的观点或推荐本文 Loading...