当前位置: 首页 > 图文教程 > 服务器 > Windows服务器 > url重写IIRF(Ionic''s Isapi Rewrite Filter)手册

Windows服务器
Windows 2000系统Ping不通 缓存在作怪
Windows 2000中如何突破注册表容量限制
浅析Windows 2000系统中的关机技巧
Windows 2000/XP安装驱动的兼容问题
在Windows 2000系统下共享ADSL的办法
时尚 让Win2k也用上XP绚丽主题
领先在起点—Win 2000操作系统的启动优化
Windows 2000 Server系统帐号安全设置技巧
轻松给Windows 2000搭建邮件服务器
让你的Windows 2000安全些,再安全些
详述Windows 2000日志及其删除方法
轻松取消Windows 2000默认共享
浅析Windows 2000操作系统中的关机技巧
更改Windows 2000系统收藏夹位置的方法
Windows操作系统的十则高级应用技巧
关于windows 2000各种服务的简要说明
Windows 2000操作系统内存优化全攻略
让Windows 2000服务运行得更好
Windows 2000操作技巧完全手册(上)
Windows 2000操作技巧完全手册(下)

Windows服务器 中的 url重写IIRF(Ionic''s Isapi Rewrite Filter)手册


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-04   浏览: 176 ::
收藏到网摘: n/a

IIRF与ISAPI_Rewrite的规划区别只在于IIRF不需要使用转义字符\,而ISAPI_Rewrite则需要使用转义字符\. 说明
IIRF与ISAPI_Rewrite的规划区别只在于IIRF不需要使用转义字符\,而ISAPI_Rewrite则需要使用转义字符\.
介绍
IIRF是一款开源的重写URL过滤器,类似于Apache的URL重写,基于VC8.0(可以用Visual Studio2005或Visual C++ 2005 Express重新编译)开发。它可以运行在IIS5.0+,支持ASP,ASP.NET,PHP等许多格式。相对比ASP.NET2.0自带的URL重写,具有更好的性能和许多我们所需要特性,重要的一点在于:它可以支持无扩展名的URL(例如:cnlbogs.com/****,你无需在创建一个默认的default.aspx文件,IIRF自动会帮你解析),让URL更加的方便我们记忆,也能进一步提高搜索的排名?IIRF能够在aspnet_isapi提前捕获我们所请求的URL进行处理,如果我们访问cnlbogs.com/a.aspx,需要获取cnlbogs.com/a.htm,步骤需要(iis-aspnet_isapi),通过IIRF,我们可以直接跳aspnet_isapi.dll,直接访问a.htm,要知道,这种方式在ASP.NET是无法实现的。
IIRF跟ASP.NET重写URL一样,它也是基于正则的方式来匹配,具有LOG记录,请求的条件判断。还是进入正题吧。
安装
IIRF安装需要我们手动操作来完成。不过。也是很方便了。
1 将IsapiRewrite4.dll, IsapiRewrite4.ini复制到c:\windows\system32\inetsrv(你也可以复制到其它适当的文件夹下面)。
IsapiRewrite4.ini是IIRF配置文件,每次该文件更改之后,IIRF会自动重新加载该文件,无需重启IIS来重新加载配置,如果您修改后INI文件后格式不正确,IIRF将会自动获取最后正确加载的配置文件。
2 打开IIS管理器,选择“默认网站”,右击“属性”,选择“ISAPI筛选器”,点击“添加”,输入筛选器名称:Ionic Rewriter,可执行文件选择上面复制到c:\windows\system32\inetsrv下面的IsapiRewrite4.dll文件,点“确定”。
3重启IISADMIN service服务。(在计算机管理----windows服务里面)
4 完成。
日志
IIRF能够将INI配置文件加载,用户的URL请求记录都会保存到指定的日志文件里。因为它具有很大的性能开销,因此建议将它日志的记录等级设为0,只有
为了方便调试的时候时候,可以设置为5,
RewriteLog 保存的日志路径,如 c:\temp\iirfLog.out
RewriteLogLevel {0,1,2,3,4,5} 日志的等级,默认值为0
0 –不会记录日志
1- 少许的日志
2- 比较多的日志
3- 比较详细的日志
4- 详细的日志(4),并会跟踪server variable和替换的字符串。
5- 详细的日志(5),包括日志文件更改的事件,建议方便调试的时候使用
正则
正则的语法跟.NET一样,只不过是格式不一样而已。所以我也不在详细介绍。具体有关正则的说明大家可以用GOOGLE搜索。
格式:
RewriteRule <url-pattern> <replacement-string> [<modifiers>]
url-pattern:匹配的正则表达式(必需)
replacement-string:要替换的字符串(必需)
modifiers:有关对RewriteRule的操作标记。可选选项。在下面我会说明

默认下IIRF的url-pattern,replacement-string正则的前面已经带了主机头的。
为了方便描述,直接看几个示例(以下示例基本全部来源IIRF文档)

RewriteRule ^/original/(.*).php /modified/$1.aspx
源:http://xxx/original/index.php
目标:http://xxx/modified/index.aspx
RewriteRule ^/dinoch/album/([^/]+)/([^/]+).(jpg|JPG|PNG) /chiesa/pics.aspx?d=$1&p=$2.$3
源:http://xxx/dinoch/album/30/1.jpg
目标:http://xxx/chiesa/pics.aspx?d=30&p=1.jpg
比较简单,主要还在于modifiers的功能。下面列举了它的所有值,允许组合(如[R,L])。
R = Redirect(URL跳转到<replacement-string>地址)
NF = Not found(返回404错误给用户,但该文件并未移除,还是保留在网站中)
L = Last test if match(如果已经匹配,将不在继续匹配下去)
F = Forbidden(跟NF标志相似,)
I = Do case-insensitive matching
U = Store original url in server Variable HTTP_X_REWRITE_URL(保存原始的url到HTTP_X_REWRITE_URL服务器变量中。)
[R] or [R=code]
就像跟我们在ASP.NET使用的Redirect方法一样,重新改变浏览器的方向,跳转到新的指定的URL中。
[R=code]允许我们指定特定的HTTP状态返回码。只能介于301到399。如果超出这个范围。默认会是使用302状态。
RewriteRule ^/goto.aspx?r=(.*)$ $1 [R]
源:http://xxx/goto.aspx?r=http://www.google.com/
目标:http://www.google.com
[L]
上面已经简单介绍过。不在说明
[NF]
上面已经简单介绍过。它还可以跟RewriteCond一起配合,来实现自定义的404错误请求。
特别要注意,你所要匹配的文件必须存在,替换的字符串不允许是存在文件名
RewriteRule ^/1008.aspx$ /1.aspx [NF]
1008.aspx文件需要存在,1.aspx不存在,否则无法正常达到我们的结果。
(很奇怪,我不知道是不是我搞错了。但我最终测试的结果确实是这样,文档也没详细说明过,有知道的朋友可以告诉我一下原因)
[F]
不在说明。
[I]
模糊匹配
[U]
保存原始的url到HTTP_X_REWRITE_URL服务器变量中。
在ASP.NET你可以用Request.ServerVariables["HTTP_X_REWRITE_URL"]获取原始值。
IIRF与ISAPI_Rewrite的规划区别只在于IIRF不需要使用转义字符\,而ISAPI_Rewrite则需要使用转义字符\.
RewriteCond
RewriteCond <test-string> <pattern> [<modifier flag[,...]>]
类似于条件判断,并且允许多个条件,OR,AND。只有当RewriteCond的Server Variable 匹配所指定的正则表达,RewriteRule才会执行。比如:
RewriteCond %{REMOTE_ADDR} ^(127.0.0.1)$
RewriteRule ^/(.*).aspx$ /$1.aspx
如果我们访问网站的地址的IP来源于127.0.0.1,那么,允许 RewriteRule ^/(.*).aspx$ /$1.aspx
RewriteCond %{REMOTE_ADDR} ^(127.0.0.1)$ [OR]
RewriteCond %{REMOTE_ADDR} ^(192.168.0.10)$
RewriteRule ^/(.*).aspx$ /$1.aspx
添加了OR来多个条件判断
RewriteCond %{REMOTE_ADDR} ^(?!127.0.0.1)([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})(.*)$
RewriteRule ^/(?!redirected.htm)(.*)$ /redirected.htm
Modifier flags有二个值
I=模糊匹配
OR=逻辑判断
从IIRF的RewriteCond的功能上来说,确实很灵活,不知道跟IIS7的重写怎么样,嘻嘻。还没瞧见过呢*^_&。另外。RewriteCond的[Patterns]可以带下面几个参数
-d
Treats the TestString as a pathname and tests if it exists,
and is a directory.
TestString是一个路径名称,并且存在这个路径
-f
Treats the TestString as a pathname and tests if it exists and
is a regular file.
TestString是一个路径名称,并且是一个存在的文件
-s
Treats the TestString as a pathname and tests if it exists and
is a regular file with size greater than zero.
TestString 是一个路径名称,并且存在文件超过0字节
如文档所使用的例子
(1)RewriteCond %{HTTP_URL} (/|\.htm|\.php|\.html|/[^.]*)$ [I] )
(2)RewriteCond %{REQUEST_FILENAME} !-f
(3)RewriteCond %{REQUEST_FILENAME} !-d
(4)RewriteRule ^.*$ /index.aspx [U,L]
(1)如果URL是以htm,php,html(模糊匹配),
(2)URL不是存在文件
(3)URL不是请求的路径
(4)将所有请求跳转到index.aspx,保存原始的URL,之后不在对此进行匹配
在如
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*
RewriteRule ^/$ /homepage.max.html [L]
IIRF其它配置属性
IterationLimit {integer}从指定的integer后开始匹配RewriteRule组。如果超出RewriteRule个数,默认将会从第8个开始。
MaxMatchCount {integer} RewriteRule组的总个数。
RewriteLog <filename stub> 日志路径
RewriteLogLevel {0,1,2,3,4,5} 日志的等级
一个常见问题
在刚安装IIRF之后就测试一下ASP.NET下面的URL,发现还是跟以前ASP.NET重写URL有一样的问题:无法改写Form下面的action的路径,而我们这时使用Request.RawUrl获取原始的URL是为空的。也许你开始注意到了我上面写过的RewriteRule的modifiers选项[U]。我们可以通过将原始的URL保存到服务器变量中。然后通过Request.ServerVariables[name]来获取。然后重写action的值就可以了。

Quote:
1 Public Class FormFixerHtmlTextWriterClass FormFixerHtmlTextWriter
2 Inherits System.Web.UI.HtmlTextWriter
3 Private _url As String
4 Public Sub New()Sub New(ByVal writer As TextWriter)
5 MyBase.New(writer)
6 _url = ForumContext.Current.Context.Request.ServerVariables("HTTP_X_REWRITE_URL")
7 End Sub
8 Public Overloads Overrides Sub WriteAttribute()Sub WriteAttribute(ByVal name As String, ByVal value As String, ByVal encode As Boolean)
9 If (Not _url Is Nothing And String.Compare(name, "action", True) = 0) Then
10 value = _url
11 End If
12 MyBase.WriteAttribute(name, value, encode)
13 End Sub
14 End Class

后记:
IIRF已经分析的差不多了。从上面可以看出,功能确实很强大,而且配置也很灵活。发现自己也慢慢喜欢上它了。嘿嘿。重要的是。它是免费,开源的。