您的位置: 首页 / 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 行进行如下更改:

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

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

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

  1. UPDATE wp_options SET option_value = "" WHERE option_name = 'rewrite_rules';

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

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

22 Responses

  1. Feb 8, 6pm / LINK / REPLY
    Gravatar

    我那虚拟主机的phpinfo()

    按照你说的改了代码和执行SQL(的确rewrite_rules成了1 执行也成功) 似乎wordpress有cache 浏览器刷新还是老样子 不知跟cache有没有关系

  2. Feb 8, 6pm / LINK / REPLY
    Gravatar

    to BunnyQ:那就要把 wp-content/cache 下的东西都删掉试试:mrgreen:

  3. Feb 8, 7pm / LINK / REPLY
    Gravatar

    以前删过一次 一刷新页面 cache又回去了 我都不知它用的什么策略 感觉是莫名其妙的
    好消息是 cache过期了 一切正常

    太感谢了 istef的php好厉害啊 每次我遇到疑难的时候总会被顺利搞定.. :smile:

    我也看到好多array_merge() 但没有意识到这些问题 不过果然还是php里的bug
    php的bug fix列表里不知有没有 en..
    permalink那部分一直没搞明白原理 这回也清楚多了 hoho
    thanks~

  4. Feb 8, 9pm / LINK / REPLY
    Gravatar

    to BunnyQ:不过这种 bug 真是够恶心的,我也找了好半天。

  5. Feb 9, 6am / LINK / REPLY
    Gravatar

    辛苦辛苦~ :lol:

  6. Mar 7, 8pm / LINK / REPLY
    Gravatar

    WordPress 数据库中执行上面的SQL语句是不是对PHP版本有要求?
    我试了一下,出现这样的错误
    MySQL said:

    1064 – You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ‘wpoptions SET optionvalue = “” WHERE optionname = ‘rewriter

  7. Mar 7, 11pm / LINK / REPLY
    Gravatar

    to arista:貌似没有什么要求,我自己的测试环境 php 4.3.1 MySQL 4.0.18 Win32 Apache,我现在的主机 php 4.3.11 MySQL 5 freebsd apache 都没问题。

    貌似你贴上那个 sql 语句也没问题吧

  8. Mar 8, 9am / LINK / REPLY
    Gravatar

    谢谢,检查了一下,把UPDATE丢了,不过执行成功后Comments RSS还是错误,不知为何?请指教

  9. Mar 8, 7pm / LINK / REPLY
    Gravatar

    to arista:可能是 WP 缓存的问题吧,过一段时间再试试

  10. Mar 18, 3am / LINK / REPLY
    Gravatar

    fgdfgvdfgvdfgvsdfgvdfgvdfv

  11. Mar 18, 9am / LINK / REPLY
    Gravatar

    我用的是WP2.0.2,当链接设置成http://snsnow.com/weblog/archives/xxx时,点击就会出现“找不到网页”,在永久链接中选择自定义并改为“/index.php/archives/%postid%”时,才能正常使用,问一下iStef ,我的BLOG可否使用像”weblog/archives/xxx”的形式。
    我对PHP不太懂,麻烦看一下我的空间是否支持mod
    rewrite ,phpinfo

  12. Mar 21, 10pm / LINK / REPLY
    Gravatar

    to Freeman:sorry,刚在待审核评论中发现这条评论。首先 wp2.02 已经没有这个 url bug。另外静态链接的实现,取决于您的服务器中是否安装有 mod_rewrite 模块。如果您在 wp 的永久链接选项中,有 http://your.domain.com/archives/123 这样的选项的话,就证明您的服务器支持 rewrite。如果这样设置后仍返回 404 的话,查看一下 apache 设置文件中关于 wp 所在目录的设置,确保 AllowOverride All,应该就可以了。

  13. Jun 6, 12pm / LINK / REPLY
    Gravatar

    看来我还是自己修改我自己写的blog来伪装静态

  14. Jul 18, 1pm / LINK / REPLY
    Gravatar

    似乎我的无论怎样都是错误~

  15. Aug 8, 11pm / LINK / REPLY
    Gravatar

    我有一个新问题,似乎也是rewrite的问题,因为我用的IIS,所以没有apachemodrewrite 的支持。
    我在permalink中设定的是这样的:/index.php/archives/%postid%.html,所以当访问一个分类的时候,链接是这样的:/index.php/archives/category/分类名称/,然而我的导航页码链接的地址却是/index.php/page/页码/,而正确的应该是/index.php/archives/category/分类名称/page/页码/这样的,查了一下问题出在getpagenumlink()里面,$SERVER['REQUEST_URI']这个变量没有能够正确得到request,不知是什么原因。

    谢谢。

  16. Aug 9, 10pm / LINK / REPLY
    Gravatar

    to robbie:这个问题我确实还没碰到过,改天仔细研究一下 wp 的代码

  17. Dec 19, 1pm / LINK / REPLY
    Gravatar

    我的ISS的,有index.php很不爽,不知道怎么解决啊

  18. Jun 20, 5pm / LINK / REPLY
    Gravatar

    魔域私服一直很流行,男孩女孩都喜欢玩,花样多,妖怪多,不过最近听说有魔域私服出来了,而且还非常多,新开变态的都有,让玩家有了娱乐的选择。

Now, It's your Turn!

BACK TO Article / Comments