IIS下配置WordPress永久链接支持中文完美方法
发现所有的中文Tag页面均是跳转到对应主题的404页面而英文是很正常的,Google了之后,终于找到一个解决的办法,贴出来分享、记载。
打开wp-includes/classes.php文件,找到如下代码:
- if ( isset($_SERVER['PATH_INFO']) )
- $pathinfo = $_SERVER['PATH_INFO'];
- else $pathinfo = '';
- $pathinfo_array = explode('?', $pathinfo);
- $pathinfo = str_replace("%", "%25", $pathinfo_array[0]);
- $req_uri = $_SERVER['REQUEST_URI'];
修改成:
- if ( isset($_SERVER['PATH_INFO']) )
- $pathinfo = mb_convert_encoding($_SERVER['PATH_INFO'], "UTF-8", "GBK");
- else $pathinfo = '';
- $pathinfo_array = explode('?', $pathinfo);
- $pathinfo = str_replace("%", "%25", $pathinfo_array[0]);
- $req_uri = mb_convert_encoding($_SERVER['REQUEST_URI'], "UTF-8", "GBK");
在iis6.0下测试通过
通过这两步修改,IIS下的WordPress效果已经相当很好了。
当然还有用如下方法的修改为:
- if ( isset($_SERVER['PATH_INFO']) )
- $pathinfo = iconv('GBK', 'UTF-8', $_SERVER['PATH_INFO']);
- else
- $pathinfo = '';
- $pathinfo_array = explode('?', $pathinfo);
- $pathinfo = str_replace("%", "%25", $pathinfo_array[0]);
- $req_uri = iconv('GBK', 'UTF-8', $_SERVER['REQUEST_URI']);
分析问题是网上说是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”文件,内容如下:
- <?php
- // IIS Mod-Rewrite
- if (isset($_SERVER['HTTP_X_ORIGINAL_URL'])) {
- $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_ORIGINAL_URL'];
- }
- // IIS Isapi_Rewrite
- else if (isset($_SERVER['HTTP_X_REWRITE_URL'])) {
- $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL'];
- }
- else
- {
- // Use ORIG_PATH_INFO if there is no PATH_INFO
- if ( !isset($_SERVER['PATH_INFO']) && isset($_SERVER['ORIG_PATH_INFO']) )
- $_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO'];
- // Some IIS + PHP configurations puts the script-name in the path-info (No need to append it twice)
- if ( isset($_SERVER['PATH_INFO']) ) {
- if ( $_SERVER['PATH_INFO'] == $_SERVER['SCRIPT_NAME'] )
- $_SERVER['REQUEST_URI'] = $_SERVER['PATH_INFO'];
- else
- $_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'] . $_SERVER['PATH_INFO'];
- }
- // Append the query string if it exists and isn't null
- if (isset($_SERVER['QUERY_STRING']) && !emptyempty($_SERVER['QUERY_STRING'])) {
- $_SERVER['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
- }
- }
- require("index.php");
- ?>
修改 web.config 文件内容如下:
- <configuration>
- <system.webServer>
- <rewrite>
- <rules>
- <rule name="ChineseURL" stopProcessing="true">
- <match url="^(tag|category)/(.*)$" />
- <action type="Rewrite" url="chineseurl.php"/>
- </rule>
- <rule name="wordpress" patternSyntax="Wildcard">
- <match url="*" />
- <conditions>
- <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
- <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
- </conditions>
- <action type="Rewrite" url="index.php" />
- </rule>
- </rules>
- </rewrite>
- </system.webServer>
- </configuration>
以上两个文件都存放在 WordPress 的安装目录。
如果 WordPress 不是装在根目录,则需要更改“<match url=”^(tag|category)/(.*)$” />”为“<match url=”^安装目录/(tag|category)/(.*)$” />”。
如果在固定链接设置里把默认的标签前缀和分类目录前缀(tag 和 category)改了,则更改这句里的对应内容即可。
此文适用于 WordPress 2.9,2.9以下版本应该也可以适用,但笔者没有测试过。
此文适用于 Godaddy 的 Windows 主机。