在 windows 主机安装 WordPress 利用 httpd.ini 固定链接及原短连接同时访问

windows 主机服务器的网站以搭
建在虚拟主机上,当我们用习惯了 apache 下的.htaccess 的时候,很难想象 windows 主机上怎么实现它的强大功能。实际上 windows 主
机服务器上的虚拟主机可以用 httpd.ini 文件来充当.htaccess 文件在 Linux 主机空间的作用,不过要令你失望的是,httpd.ini 的
功能完全没有.htaccess 那么强大,规则上没有那么丰富,细节上也有很大的不同。如果你在 win 主机上安装了 WordPress,那么对付
WordPress 固定链接的设置将是一件令你头痛的事。本文致力解决这一问题,并尽量详尽。

一、 httpd.ini 实现域名 301 重定
向:[ISAPI_Rewrite]RewriteCond Host: ^toolmao.com$RewriteRule (.*)
http://www.toolmao.com$1 [R,I,L] 这不是本文的重点,只不过跟本文的 SEO 有点关系,顺带写上,一笔带过。

二、
httpd.ini 实现 WordPress 固定链接:[ISAPI_Rewrite]RewriteRule /sitemap.xml
/sitemap.xml [L]RewriteRule /favicon.ico /favicon.ico [L]RewriteRule
/wap(.*) /wap$1 [L]RewriteRule /content/uploads/(.*) /content/uploads/$1
[L]RewriteRule /wp-(.*) /wp-$1 [L]RewriteRule ^/$ /index.php
[L]RewriteRule /(.*) /index.php/$1
[L] 将上面的代码保存在一个名叫 httpd.ini 的文本文件中(用 txt 文件直接修改文件名),上传到 web 根目录,这样 win 主机下就能实现
WordPress 的固定链接了,并且你可以放心大胆的将后台设置固定链接中的 “/index.php/” 去除掉。

如果你在 linux 主机
下了解过.htacess 文件的使用,那么应该对此段代码不会陌生。只不过在 httpd.ini 中需要排除/sitemap.xml 等类似的单独页面,如
果不在加上这些相关语句,那么你的 WordPress 将会返回给用户 “页面未找到” 的提示,原因正如你想到的一样,因为你做了 RewriteRule
/(.*)/index.php/$1
[L] 的规定,所以当你访问/sitemap.xml 实际上已经重写到/index.php/sitemap.xml 了,自然没有该页面。如果你还不明白
不清楚语句的意思,你可以看本文参考来源,或到网上寻找.htaccess 的教程方只其中奥妙。

虽然网上还有其他的办法,但本人认为这是最好的方法。在上传了 httpd.ini 之后,虽然实现了最初的固定链接网址形式,但有一个不太让人容易注意到的地方是,当你点击某个标签时,会发现找不到该页,原因是你的网址中含有中文字符,需要做如下修改:


改网站目录下 wp-include/classes.php 文件(最新 3.1 版需要修改的文件是 wp-include/class-
wp.php)$pathinfo = $_SERVER[‘PATH_INFO’]; 修改为 $pathinfo =
mb_convert_encoding($_SERVER[‘PATH_INFO’], ‘UTF-8′, ‘GBK’);$req_uri =
$_SERVER[‘REQUEST_URI’]; 修改为 $req_uri =
mb_convert_encoding($_SERVER[‘REQUEST_URI’], ‘UTF-8′,
‘GBK’); 三、解决?p=postid 形式的文章短连接仍然可以访问的问题

你可能对这种 rewrite 规则比较熟悉,国内的程序基本上
都是用这种 Rewrite 。请注意这时 WP 的内部过程完全不同,WP 的 query
vars 值均来源于 $_GET(Apache 直接 rewrite 生成的),
但 Request_uri 或 Path_Info 仍会被解析并且生成的 $perma_query_vars 完全正确,只是不会被用于 query
vars 而已。因为 $_GET 优先级高于对 url
rewrite 获得的值,因此在 windows 下 IIS 的 httpd.ini 里加入 rewrite 规则,后台 permalink 设置为默认后
rewrite 后友好地址仍可以访问。为了使网站更有利于 SEO,减少不同网址却内容相同的情况,我们对文章页、分类页、单独页面做如下处理:


WordPress 主题文件头部文件或能够被全局访问的文件内加入如下代码 if($_GET[‘p’]||$_GET[‘page_id’])
{if($_GET[‘p’])$id=$_GET[‘p’];if($_GET[‘page_id’])$id=$_GET[‘page_id’];$post=
get_post($id);$name=$post->post_name;header(‘HTTP/1.1 301 Moved
Permanently’);//发出 301 头部 header(‘Location:
‘.bloginfo(‘url’).’/’.$name.’/’);exit();}else
if($_GET[‘cat’]){$id=$_GET[‘cat’];$cat=get_category($id);$name=$cat->slug;header(‘HTTP/1.1
301 Moved Permanently’);header(‘Location:
‘.bloginfo(‘url’).’/cat/’.$name.’/’);exit();}else
if($_GET[‘tag’]){$name=$_GET[‘tag’];header(‘HTTP/1.1 301 Moved
Permanently’);header(‘Location:
‘.bloginfo(‘url’).’/tag/’.$name.’/’);exit();} 这段代码根据网址中是否包含
p,page_id,cat,tag 参数进行跳转,进入其别名为网址的页面。你也可以根据这种方法,来跳转更多的页面。当然这只是简单的处理方法,如果你
的要求不是很高,可以使用该方法,如果你使用了其他的插件导致网址中出现 p 等参数,则需要写更多的代码来排除它。

由于 win 主机在这方面的严重缺陷,故建议使用 WordPress 建站的朋友尽量选择 U 主机,这样对各种自定义功能的实现更加直接。