填写您的邮件地址,订阅我们的精彩内容:

httpd.ini使用详解:重定向、绑定目录、wordpress固定链接

715

windows主机服务器的网站以搭建在虚拟主机上,当我们用习惯了apache下的.htaccess的时候,很难想象windows主机上怎么实现它的强大功能。实际上windows主机服务器上的虚拟主机可以用httpd.ini文件来充当.htaccess文件在Linux主机空间的作用,不过要令你失望的是,httpd.ini的功能完全没有.htaccess那么强大,规则上没有那么丰富,细节上也有很大的不同。

要在你的空间使用httpd.ini首先得确定你的空间是否支持该功能,这个可以询问服务商,如果是企业用户,可以要求服务商为你配置。如果你用的是你自己的独立服务器,那么请到网上查找资料,由于frustigor没有找到相关的权威文件,不敢妄言,以下的内容也只作为参考。我们来看一段简单的httpd.ini内容实现的功能,从这段代码讲开来:

[ISAPI_Rewrite]

RewriteRule /(.*).html /index.php?p=$1 [L]

上面这段小代码不难让你想象它的功能,即先开启重写功能,然后执行一条规则,将跟目录下后缀为.html的网址内容和/index.php?p=后面的内容匹配。如果你访问的是http://yousite.com/23.html那么你可以用这个网址来访问http://yoursite.com/index.php?p=23这个真实的地址。关于httpd.ini的部分规则,将会在下面的案例中一一讲到。

一、httpd.ini实现域名301重定向:

[ISAPI_Rewrite]

RewriteCond Host: ^utubon.com$

RewriteRule (.*) http://www.utubon.com$1 [R,I,L]

上面这段代码实现了将utubon.com重定向到www.utubon.com。这种方法据说是有利有SEO的,下面稍作讲解:

[ISAPI_Rewrite]是开启重写能力的意思,每个单词都对应了英文的原意,英语好的朋友可以揣度一下。

RewriteCond提出条件,相当于IF。Host后面跟上域名,即条件内容,域名为utubon.com的情况下,执行下面的规则。^是开始标记,即域名以utubon.com开始,$为结尾标记,即域名以utubon.com结尾。整条语句的意思“重写条件 域名以u开头到com结束的情况下,往下执行”言外之意不符合则不执行。“”是转义字符,在httpd.ini中需要对这种index.php中间的点加以转义。

RewriteRule则是指执行的规则。(.*)即第一个要匹配的内容,也就是说你的用这个东西将要代替另外一样。“.”指任意字符,“*”指这个字符重复0或更多次,如果是“+”意思为重复1或更多次。那么“(.*)”的意思就是指任意字符而且该字符可以随意重复N次,其实就是任意内容了。后面则是将前面的(.*)代替什么了,用$1表示。也就是说如果我输入的是http://utubon.com/myname那么实际上服务器将用http://www.utubon.com/myname这个网址。这样就实现了域名的重定向。再举一例,如果规则为RewriteRule /(.*).html http://www.utubon.com/index.php?p=$1 [R,I,L]那么只会当你用http://utubon.com/post.html访问时跳转为http://www.utubon.com/index.php?p=post。实际上这种方法我们只用在域名跳转上,不用在单独网页跳转上,从而实现301重定向。

二、httpd.ini实现域名绑定之目录:

[ISAPI_Rewrite]

RewriteCond Host: ^utubon.com$

RewriteRule ^(.*)$ /utubon.com/$1 [I]

RewriteCond Host: ^www.utubon.com

RewriteRule /utubon.com/(.*)$ http://utubon.com/$1 [R,I]

如果按照上面一段的分析,我想你应该能慢慢理解这段代码的内容:开启重写能力,如果访问的域名是utubon.com,无论后面跟随什么,都代替utubon.com/utubon.com/这个网址后面的内容,如果访问的网址是www.utubon.com/utubon.com/后面无论跟随什么内容,那么都将网址变为utubon.com并后面用访问网址后面的内容代替。这样两个循环,实现了子目录/utubon.com/被绑定到utubon.com上。

frustigor找到了绑定子目录后将wordpress放在被绑定子目录下面的wordpress的固定链接的办法,虽然有些小缺陷,但总体上能实现这个想法。具体看下一页。

三、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]

我想你通过前面的讲解,应该可以很好的理解这段了。但是在一些细节上,你可能并不明白为什么要这么写,而不去掉或添加点东西。这段代码的规则部分中你需要注意的是前面两句实现了你仍然可以访问这两个文件,如果没有这两句,你的wordpress会给出未找到文章的提示错误页面。接下来两句是让你可以访问/wap/和/content/uploads/这两个目录的规则。如果没有,那么无论你是访问该目录,还是从该目录下载东西,都将被wordpress返回未找到页面的提示。最后三句规则则是实现wordpress能够像在Linux上采用乐观的固定链接的形式的关键。本站每篇内容的网址都逃离了win主机wordpress固定连接顶层目录被加/index.php/的厄运,直接可以成为华丽的自定义网址。

四、结合上面的所有内容,或者httpd.ini的其他没讲到的规则,你可以实现更多的功能

例如,你可以将第一和第三方案结合起来,不仅在将utubon.com域名定向到www.utubon.com而且可以想办法将所有的?p=postid的网址定向到固定链接网址,这个还是比较难的,乌徒帮暂时没有实现,希望朋友们能最终实现。

今天采用一种根据这接收地址来跳转的代码,如下:

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’);//发出301头部
header(‘Location: ‘.bloginfo(‘url’).’/cat/’.$name.’/’);
exit();
}else if($_GET[‘tag’]){
$name=$_GET[‘tag’];
header(‘HTTP/1.1 301 Moved Permanently’);//发出301头部
header(‘Location: ‘.bloginfo(‘url’).’/tag/’.$name.’/’);
exit();
}

另外,这种方法还要让wordpress支持中文转码网址,必须修改wordpress源文件:

修改网站目录下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’);

就这样,中文的TAG标签页等都可以打开了的。

来自http://www.xuyublog.com/48/的资料:

你可能对这种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后友好地址仍可以访问, 就是这个原因.

下面我简单说几句