在Wordpress 3.3.2中,如果设置了Permalink (not selecting default in Settings->Permalinks->Common Settings),当用户搜索的时候,原本index.php?s=THINGS_YOU_WANT_TO_SEARCH的GET请求形式(如Figure 1)会变成search/THINGS_YOU_WANT_TO_SEARCH(如Figure 2)。这样能够使URL变得更加富含语意(semantic)。但是,当THINGS_YOU_WANT_TO_SEARCH中包含特殊字符,如#, ?,或者其他语言,如中文,的时候,问题就来了:使用前面非Permalink的搜索GET请求可以正常搜索,而使用后面Permalink形式的搜索GET请求则不能够进行搜索,WordPress 3.3.2会提示“找不到”或者会去掉非标准URL字符进行搜索,而得出错误的搜索结果。
这肯定是Wordpress 3.3.2内部在decode URL请求不一致造成的。我在网上找了一下,没发现什么方法能够很好的解决这个问题。我估计中文版的Wordpress也许根本就不存在这个问题。
目前,在不修改Wordpress 3.3.2源代码的情况下解决这个问题的最佳方法应该就是通过Apache的mod_rewrite了吧。以下是我的解决方案:
在WP根目录下打开或者创建一个.htaccess文件,并添加以下内容:
1 2 3 |
RewriteEngine on RewriteBase / RewriteRule ^search/(.*)$ /?s=$1 [L,R=302] |
注意,其中的RewriteBase应该是你WP相对于根目录的路径,如/wordpress/,我的WP安装在更目录的,所有是/。
虽然现在还没发现这个解决方法的bug,这只是一个临时的方法(所以我才用302, Moved temporarily),为了让Wordpress 3.3.2能够方便地在未来进行升级。Permalink是很诱人的,希望WP在未来版本中能够很好地解决这个问题。