Windows IIS信息服务器管理器下httpd.ini的作用

1.简介

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

2.功能

我们来看一段简单的httpd.ini内容实现的功能,从这段代码开始:
[ISAPI_Rewrite]
RewriteRule /(.*).html /index.php?p=$1 [L]
上面这段小代码不难让你想象它的功能,即先开启重写功能,然后执行一条规则,将根目录下后缀为.html的网址内容和/index.php?p=后面的内容匹配。你可以用这个网址来访问这个真实的地址。关于httpd.ini的部分规则,将会在下面的案例中一一讲到。

2.1域名定向

[ISAPI_Rewrite]
RewriteCond Host: ^$
RewriteRule (.*) [R,I,L]
上面这段代码实现了将重定向到。这种方法据说是有利有SEO的。
[ISAPI_Rewrite]是开启重写能力的意思,每个单词都对应了英文的原意。
RewriteCond提出条件,相当于IF。Host后面跟上域名,即条件内容,域名为情况下,执行下面的规则。^是开始标记,即域名以开始,$为结尾标记,即域名以结尾。整条语句的意思“重写条件 域名以u开头到com结束的情况下,往下执行”言外之意不符合则不执行。“”是转义字符,在httpd.ini中需要对这种index.php中间的点加以转义。
RewriteRule则是指执行的规则。(.*)即第一个要匹配的内容,也就是说你的用这个东西将要代替另外一样。“.”指任意字符,“*”指这个字符重复0或更多次,如果是“+”意思为重复1或更多次。那么“(.*)”的意思就是指任意字符而且该字符可以随意重复N次,其实就是任意内容了。后面则是将前面的(.*)代替什么了,用$1表示。也就是说如果我输入的是不带WWW的那么实际上服务器将用带WWW的这个网址。这样就实现了域名的重定向。再举一例,如果规则为RewriteRule /(.*).html [R,I,L]那么只会当你用访问时跳转为静态路径。实际上这种方法我们只用在域名跳转上,不用在单独网页跳转上,从而实现301重定向。

2.2域名绑定

[ISAPI_Rewrite]
RewriteCond Host: ^$
RewriteRule ^(.*)$ /$1 [I]
RewriteCond Host: ^www.
RewriteRule //(.*)$ R,I]
如果按照上面一段的分析,我想你应该能慢慢理解这段代码的内容:开启重写能力,如果访问的域名是,无论后面跟随什么,都代替/这个网址后面的内容,如果访问的网址是后面无论跟随什么内容,那么都将网址变为并后面用访问网址后面的内容代替。这样两个循环,实现了子目录/被绑定到上。
frustigor找到了绑定子目录后将wordpress放在被绑定子目录下面的wordpress的固定链接的办法,虽然有些小缺陷,但总体上能实现这个想法。

2.3修改状态

[ISAPI_Rewrite]
# 3600 = 1 hour
CacheClockRate 3600
RepeatLimit 32
# Protect httpd.ini and httpd.parse.errors files
# from accessing through HTTP
# Rules to ensure that normal content gets through
RewriteRule /sitemap.xml /sitemap.xml [L]
RewriteRule /favicon.ico/favicon.ico [L]
RewriteRule /sitemap_baidu.xml /sitemap_baidu.xml [L]
RewriteRule /sitemap.html /sitemap.html [L]
RewriteRule /archivers/(.*) /archivers/$1 [L]
# For file-based wordpress content (i.e. theme), admin, etc.
RewriteRule /wp-(.*) /wp-$1 [L]
# For normal wordpress content, via index.php
RewriteRule ^/$ /index.php [L]
RewriteRule /(.*) /index.php/$1 [L]
这段代码的规则部分中你需要注意的是前面两句实现了你仍然可以访问这两个文件,如果没有这两句,你的wordpress会给出“未找到文章”的提示错误页面。接下来两句是让你可以访问/wap/和/content/uploads/这两个目录的规则。如果没有,那么无论你是访问该目录,还是从该目录下载东西,都将被wordpress返回未找到页面的提示。最后三句规则则是实现wordpress能够像在Linux上采用乐观的固定链接的形式的关键。每篇内容的网址都逃离了win主机wordpress固定连接顶层目录被加/index.php/的厄运,直接可以成为华丽的自定义网址。

3方法

采用一种根据这接收地址来跳转的代码,如下:
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’);//
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();
}
另外,这种方法还要让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标签页等都可以打开了的。

4.用法

zblog2.0放于二级目录静态化httpd.ini的设置方法
这里的httpd.ini必须放于根目录,而不是二级目录下面
httpd.ini的设置代码:
RewriteRule ^(.*?)default_([0-9]+).html $1catalog\.asp\?page=$2
RewriteRule ^(.*?)category-([0-9]+)\.html $1catalog\.asp\?cate=$2
RewriteRule ^(.*?)category-([0-9]+)_([0-9]+)\.html $1catalog\.asp\?cate=$2&page=$3
RewriteRule ^(.*?)author-([0-9]+)\.html $1catalog\.asp\?auth=$2
RewriteRule ^(.*?)author-([0-9]+)_([0-9]+)\.html $2catalog\.asp\?auth=$2&page=$3
RewriteRule ^(.*?)tags-(.*)\.html $1catalog\.asp\?tags=$2
RewriteRule ^(.*?)tags-(.*)_([0-9]+)\.html $1catalog\.asp\?tags=$2&page=$3
RewriteRule ^(.*?)([0-9\-]+)\.html $1catalog\.asp\?date=$2
RewriteRule ^(.*?)([0-9\-]+)_([0-9]+)\.html $2catalog\.asp\?date=$2&page=$3
直接复制,粘贴到httpd.ini里面即可。
后台需要开启静态化,这个设置是默认的设置,如果是自行设置的,请根据实际情况修改即可。。

附:下面为本站httpd.ini文件内容

[ISAPI_Rewrite]
# Protect httpd.ini and httpd.parse.errors files
# from accessing through HTTP
# # list/PostID.php
# # blog/%post_id%.php
RewriteRule /Tags/(.*) /index.php?tag=$1
RewriteRule /(about|contact|about-copyright|favor|archives|tags|sitemap|link|help|security|%e5%85%b3%e4%ba%8e) /index.php?pagename=$1
RewriteRule /Category/(.*)/(feed|rdf|rss|rss2|atom)/?$ /wp-feed.php?category_name=$1&feed=$2
RewriteRule /Category/?(.*) /index.php?category_name=$1
RewriteRule /author/(.*)/(feed|rdf|rss|rss2|atom)/?$ /wp-feed.php?author_name=$1&feed=$2
RewriteRule /author/?(.*) /index.php?author_name=$1
RewriteRule /rss.xml /wp-feed.php/?feed=rss2
RewriteRule /feed/?$ /wp-feed.php/?feed=rss2
RewriteRule /comments/feed/?$ /wp-feed.php/?feed=comments-rss2
RewriteRule /([0-9]+).html /index.php?p=$1 [I]
RewriteRule /page/(.*)/?s=(.*) /index.php?s=$2&paged=$1
RewriteRule /page/(.*) /index.php?paged=$1
RewriteRule /date/([0-9]{4})([0-9]{1,2})([0-9]{1,2})/([^/]+)/?([0-9]+)?/?$ /index.php?year=$1&monthnum=$2&day=$3&name=$4&page=$5
RewriteRule /date/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$ /index.php?year=$1&monthnum=$2&day=$3&page=$4
RewriteRule /date/([0-9]{4})/([0-9]{1,2})/?$ /index.php?year=$1&monthnum=$2&page=$3
RewriteRule /([0-9]+).html/(feed|rdf|rss|rss2|atom) /index.php?feed=rss2&p=$1
RewriteRule /([0-9]+).html/trackback /wp-trackback.php?p=$1