IIS下配置WordPress永久链接支持中文完美方法

发现所有的中文Tag页面均是跳转到对应主题的404页面而英文是很正常的,Google了之后,终于找到一个解决的办法,贴出来分享、记载。


打开wp-includes/classes.php文件,找到如下代码:

  1. if ( isset($_SERVER['PATH_INFO']) )  
  2.    $pathinfo = $_SERVER['PATH_INFO']; 
  3. else  $pathinfo = ''
  4. $pathinfo_array = explode('?', $pathinfo); 
  5.  $pathinfo = str_replace("%", "%25", $pathinfo_array[0]); 
  6.  $req_uri = $_SERVER['REQUEST_URI'];  


修改成:

 

  1.  if ( isset($_SERVER['PATH_INFO']) ) 
  2.   $pathinfo = mb_convert_encoding($_SERVER['PATH_INFO'], "UTF-8", "GBK");  
  3. else  $pathinfo = ''
  4.   $pathinfo_array = explode('?', $pathinfo); 
  5.   $pathinfo = str_replace("%", "%25", $pathinfo_array[0]); 
  6.   $req_uri = mb_convert_encoding($_SERVER['REQUEST_URI'], "UTF-8", "GBK"); 
  7.  

在iis6.0下测试通过

通过这两步修改,IIS下的WordPress效果已经相当很好了。


当然还有用如下方法的修改为:

  1. if ( isset($_SERVER['PATH_INFO']) ) 
  2.         $pathinfo = iconv('GBK', 'UTF-8', $_SERVER['PATH_INFO']); 
  3. else 
  4.         $pathinfo = ''
  5. $pathinfo_array = explode('?', $pathinfo); 
  6. $pathinfo = str_replace("%", "%25", $pathinfo_array[0]); 
  7. $req_uri = iconv('GBK', 'UTF-8', $_SERVER['REQUEST_URI']); 
  8.  

分析问题是网上说是IIS这样的错误导致在WordPress中,对$_SERVER['PATH_INFO']和$_SERVER['REQUEST_URI']取值时就会取到GBK编码的url,但是WordPresss是用UTF-8编码的,所以中文就转成了乱码,再转换成SQL去数据库查询的时候就怎么也找不到记录了。

有时间再查一查看看是否修改一些开关可否避免这种愚蠢的瞎转换.....

下面是另外一种方法,可惜我没有试成功Windows主机WordPress中文链接404错误解决方案
由 iGuang 撰写 http://iguang.info/2010/05/19/wordpress-chinese-url-404-solution/
用 WordPress 写中文博客时 URL 中经常会包含中文字符,一般出现在 Tag 和分类的 URL 中。而 IIS7 对包含中文的 URL 支持有问题。这样的情况下访问如「http://opnir.com/tag/软件」这样的 URL 就会发生 404 错误。
像 Godaddy 的 Windows 主机正是使用 IIS7 作为 Web 服务器的,在此空间上使用 WordPress 就会出现以上问题,虽然可以通过修改程序文件或者修改 Tag 和分类的别名为英文的方法来解决,但非常不实用。
测试环境:Godaddy Windows主机, IIS7.0,WordPress2.9.2简体中文版,http://iguang.info
方案一:来自铭的Blog,试用有效。
下面介绍一种解决方法,只需要增加一个 PHP 文件,并修改一下 web.config 文件中的 Rewrite 规则即可,不需要修改程序文件。
新建一个“chineseurl.php”文件,内容如下:

  1. <?php 
  2.  
  3. // IIS Mod-Rewrite  
  4. if (isset($_SERVER['HTTP_X_ORIGINAL_URL'])) { 
  5. $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_ORIGINAL_URL']; 
  6. // IIS Isapi_Rewrite  
  7. else if (isset($_SERVER['HTTP_X_REWRITE_URL'])) { 
  8. $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL']; 
  9. else 
  10. // Use ORIG_PATH_INFO if there is no PATH_INFO  
  11. if ( !isset($_SERVER['PATH_INFO']) && isset($_SERVER['ORIG_PATH_INFO']) ) 
  12. $_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO']; 
  13.  
  14. // Some IIS + PHP configurations puts the script-name in the path-info (No need to append it twice)  
  15. if ( isset($_SERVER['PATH_INFO']) ) { 
  16. if ( $_SERVER['PATH_INFO'] == $_SERVER['SCRIPT_NAME'] ) 
  17. $_SERVER['REQUEST_URI'] = $_SERVER['PATH_INFO']; 
  18. else 
  19. $_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'] . $_SERVER['PATH_INFO']; 
  20.  
  21. // Append the query string if it exists and isn't null  
  22. if (isset($_SERVER['QUERY_STRING']) && !emptyempty($_SERVER['QUERY_STRING'])) { 
  23. $_SERVER['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING']; 
  24.  
  25. require("index.php"); 
  26.  
  27. ?>

修改 web.config 文件内容如下:

  1. <configuration> 
  2.   <system.webServer> 
  3.     <rewrite> 
  4.       <rules> 
  5.        <rule name="ChineseURL" stopProcessing="true"> 
  6.           <match url="^(tag|category)/(.*)$" /> 
  7.           <action type="Rewrite" url="chineseurl.php"/> 
  8.         </rule> 
  9.         <rule name="wordpress" patternSyntax="Wildcard"> 
  10.           <match url="*" /> 
  11.             <conditions> 
  12.               <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
  13.               <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> 
  14.             </conditions> 
  15.           <action type="Rewrite" url="index.php" /> 
  16.         </rule> 
  17.       </rules> 
  18.     </rewrite> 
  19.   </system.webServer> 
  20. </configuration> 

以上两个文件都存放在 WordPress 的安装目录。
如果 WordPress 不是装在根目录,则需要更改“<match url=”^(tag|category)/(.*)$” />”为“<match url=”^安装目录/(tag|category)/(.*)$” />”。

如果在固定链接设置里把默认的标签前缀和分类目录前缀(tag 和 category)改了,则更改这句里的对应内容即可。
此文适用于 WordPress 2.9,2.9以下版本应该也可以适用,但笔者没有测试过。
此文适用于 Godaddy 的 Windows 主机。

posted @ 2013-02-03 12:03  汪磊  阅读(1383)  评论(0编辑  收藏  举报