WordPress在Windows- iis主机中实现完美固定链接

在网上找到的,很有用。利用404自定义错误能实现不带index.php的固定链接,可如果地址中有中文会因为中文地址转码出现错误,网上找到个教程,完美解决了wordpress在WINDOWS IIS主机里实现完美固定链接(包括中文地址和标签)的问题。经过测试,wordpress-2.9.2也照样能行。转了。

刚才在phplamp.org上看到的,这是个很好的解决方法,对Win主机的朋友们真是太爽了!

不过仔细想来,现在虚拟主机的用户,一般都没有权利添加ISAPI组件,也不能说动主机服务商去给你添加*.Dll之类的东西,他们考虑的问题很多,是不 是影响了其他客户,是不是影响了速度,再者,这是规定不允许的……

不过这么好的方法,我还是不能私自藏起来,决定放在这里与朋友们分享,特别指出,以下为转载,原地址:http://www.phplamp.org/2008/06/wp-iis-isapi/

原文:

要说Wordpress中的完美工作环境,当然要属于Lamp平台,或是稍微逊色一点的Wamp平台;但是由于某此特殊原因,我们没有选择它们,而 是选择了Windows+iis+MySql+Php,我把它统称为:Wimp平台。

这次我要说的就是如何在Wimp平台中实现Wordpress的完美URL结构!

例:http://www.phplamp.org/2008/06/wp-iis-isapi/ (本文的URL)

用过Wordpress的应该都知道,实现这样的URL只需要在后台中:Settings->permalinks,然后设置成自己中意的 URL就行了。但是前提是您的空间支持 rewrite || 您的虚拟主机支持 .htaccess。Lamp,Wamp中只要开启加载mod_rewrite模块就行了。但是Wimp却不是这么简单的,它如果想实现rewrite功 能只能借助于第三方的ISAPI组件。

如现在比较火的:http://www.helicontech.com/isapi_rewrite/ 这是一个国外的组织专 门为IIS写的ISAPI Rewrite组件,非常类似于Apache的mod_rewrite。有免费版与收费版!很多网友说实现WP在IIS中的rewrite功能只需要下载 一个它的组件就OK了。我在本地测试了好一阵子,没有成功,而且用它的比较麻烦,还要自己写rewrite规则!(没有成功可能是我没写正确规则, 汗!)。最后我放弃了它……

下面说一下本博客中(phplamp.org)用到的ISAPI组件吧:

wp-url-rewriting.dll 下载地址:http://code.google.com/p/wp-url-rewriting-on-iis/downloads/list

这是位好心的牛人专门为工作于iiS中的WP写的ISAPI rewrite组件,用它您根本就不用写rewrite规则,您只需要将其加载到您的ISAPI中,然后进wp后台定义自己的permalinks即 可。 假如你用的是虚拟主机的话,您可以联系您的空间商让其为您添加上这个组件。从此您的WP也可以完美rewrite了。

如果你不能添加组件可以用404页面来实现,方法如下:
创建一个404错误页面,并且写入下列4行代码即可简单优雅的实现无插件完美支持windows iis主机的永久固定链接的伪静态化地址格式。去掉网页地址中的index.php!代码如下:

 
<?php
$ori_qs = $_SERVER&#91;'QUERY_STRING'&#93;;
$pattern = '/&#91;^;&#93;+;&#91;^:&#93;+:\/\/&#91;^\/&#93;+(\/&#91;^\?&#93;*)(?:\?(.*))?/i';
preg_match($pattern, $ori_qs, $matches);
$_SERVER&#91;'PATH_INFO'&#93;    = $matches&#91;1&#93; . '?' . $matches&#91;2&#93;;
$_SERVER&#91;'REQUEST_URI'&#93;  = $_SERVER&#91;'PATH_INFO'&#93;;
$query_args              = explode('&', $matches&#91;2&#93;);
unset($_GET);
foreach ($query_args as $arg)
{
    $the_arg = explode('=', $arg);
    $_GET&#91;$the_arg&#91;0&#93;&#93; = $the_arg&#91;1&#93;;
}
include('index.php');
?>

这样即可固定REQUEST_URI和PATH_INFO参量并且包括进去index.php,剩下的将交给wordpress完成任务(说实话,这参数定义代码偶也不清楚,依葫芦画瓢即可)。

注意本文还没有 完呢!

当我们定义好permalinks后,可能您会发现,我们点击中文标量的文章链接时说找不到网址。

例:http://www.phplamp.org/2008/06/php%e4%b8%ad%e7%9a%84%e6%96%87%e7%ab%a0/

这是因为:WP的编码为utf-8,而这篇文章的URL中Slug(上链接红色部分)编码为gbk。然后WP取得文章Slug后,通过它来查找文章 就会找不到!因为编码不同呀。

更改方法:

wp-include/classes.php中(44-50行)
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'];

替换为下(转换$_SERVER[‘PATH_INFO’]和$_SERVER[‘REQUEST_URI’]的编码):

PHP代码

 
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’);

这个操作的意思就是:将Slug的编码由GBK转换为utf-8(您也可以用iconv,或是其它的函数来代 替mb_convert_encoding)。”

我的结束语:如果使用Wp,我决定还是Lunix主机是最好的,因为Php、SQL本来就在Lunix下产生的,运行当然快。欢迎大家关于Wp的问题留言 探讨!

这样操作,会有一些性能损耗,毕竟编码转换需要耗费系统资源的。

同时要求,PHP开启了 mb_string

2 Comments

Add a Comment

Your email address will not be published.