IIRF免费开源的URL伪静态重写插件

介绍

 IIRF是一款开源的重写URL过滤器,类似于ApacheURL重写,基于VC8.0(可以用Visual Studio2005Visual 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是无法实现的。

 IIRFASP.NET重写URL一样,它也是基于正则的方式来匹配,具有LOG记录,请求的条件判断。还是进入正题吧。 

安装

 IIRF安装需要我们手动操作来完成。不过。也是很方便了。

1 IsapiRewrite4.dll, IsapiRewrite4.ini复制到c:\windows\system32\inetsrv(你也可以复制到其它适当的文件夹下面)

IsapiRewrite4.iniIIRF配置文件,每次该文件更改之后,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 <filename stub>  保存的日志路径,如 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"]获取原始值。

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的值就可以了。


 1 Public Class FormFixerHtmlTextWriter
 2        Inherits System.Web.UI.HtmlTextWriter
 3        Private _url As String
 4        Public 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(ByVal name As StringByVal value As StringByVal encode As Boolean)
 9            If (Not _url Is Nothing And String.Compare(name, "action"True= 0Then
10                value = _url
11            End If
12            MyBase.WriteAttribute(name, value, encode)
13        End Sub

14    End Class

2007-09-01]
http://zhangsichu.com/blogview.asp?Content_Id=82
这里已经有人实现了二级域名的重写,大家可以去看看.感谢 tombom 提供的信息.

IIRF网站:http://cheeso.members.winisp.net/IIRF.aspx

-----------------------------------------------------------------------------------------------------------

IIRF是Ionic出品的ISAPI Rewriting Filter,专门为IIS服务的URL重写插件,完全开源,完全免费。抛弃ISAPI_Rewrite的99美元费用吧。真正可用,这下IIS下的所有的伪静态、二级域名泛解析全部搞定。

    首先,到官方网站 http://iirf.codeplex.com/ 下载最新版本的 IIRF,飘易看到的最新的版本是 IonicIsapiRewriter-2.1.1.23-Release-Win32-bin.zip 。

一、安装方法:
1、把 bin 目录下的文件全部拷贝到 D:\rewrite ,目录你可以自定义。

2、如果你创建一个服务器全局范围的设置文件(IirfGlobal.ini),你必须把它与(IIRF.dll)文件在同一目录中。 该URL Rewrite筛选器将寻找其在该文件中的全局设置文件。
3、对(IIRF.dll)文件赋予 IIS_WPG用户组“读取”、“读取与运行”、“写入”权限。

点击查看原图
4、 打开Internet信息服务管理器。
右键点击IIS管理器左栏“网站” 》“属性”,弹出“网站属性”选项卡,选择“ISAPI筛选器”,如下图添加IIRF。

点击查看原图

点击查看原图
5、重启IIS

点击查看原图
6、右键点击IIS管理器左栏“网站” 》“属性”,弹出“网站属性”选项卡,选择“ISAPI筛选器”,查看“IIRF”加载是否成功。若是绿色向上箭头,则表示加载成功。(提示,IIS重启后,人工访问一下该网站,不然无法触发,也就加载不成功)

点击查看原图二、规则文件格式基本和Apache的 mod_rewrite、ISAPI Rewrite一样
IIRF是参照Apache的 mod_rewrite 模块改写而来,所以大部分规则和mod_rewrite一样。略有区别,部分区别如下:
IIRF不支持这些修饰符 [C]、[co]、[E]、[N]、[NE]、[NI]、[NS]、[PT]、[S]、[T]
支持[I](作为[NC]的别名)

规则文件可随时修改,随时生效!

三、日志设置
在IIRF中日志值可以设置为0-5,在规则文件的开头部分有两行设置日志类型:

RewriteLog   C:\Rewrite\supesite\iirfLog.out (注意要写清楚路径,各站点不同) 
RewriteLogLevel 0   (0为不记录,3为一般测试,5为处理故障)

日志的代价高昂,同时不会自动删除文件,日志类型一定要设成0,除非用于检查才能修改为其他值,检查完后一定要改为0,否则日志文件把硬盘占满就麻烦了。如果日志不为0,筛选器起用后,对应文件夹会产生类似以下的文件,是文本格式的,可以用记事本查看。(via:没有ISAPI Rewrite FULL照样玩多站点URL Rewrite伪静态:Ionic’s Isapi Rewrite Filter (IIRF,伪静态URL重写筛选器)的安装与配置)

四、使用方法举例:
先在需要重写的网站根目录下创建(IIRF.ini)文件,并在文件中写入以下规则:

RewriteLogLevel 0 
RewriteLog  D:\iirf\logfiles\fxxsd
RewriteEngine ON
StatusInquiry ON 

RewriteCond %{HTTP_HOST}  ^(?!www)([^.]+)\.piaoyi\.org [NC]
RewriteRule ^/(.*)$  /type/*1.htm [U,L]

    该规则实现的是 任意二级域名 a.piaoyi.org 、b.piaoyi.org、123.piaoyi.org (除www外)等自动重定向到 /type/a.htm 、 /type/b.htm、 /type/123.htm 下。(飘易提醒:IIRF回调符是 *1,而 ISAPI_Rewrite里的回调符是 %1).

    更多的例子,请参考IIRF的英文帮助手册:
例子1,阻止特定IP段访问

RewriteLogLevel 1
RewriteLog c:\inetpub\iirfLogs\iirf
RewriteEngine ON
StatusInquiry ON
IterationLimit 5

# If the IP address is not in the specified range, return 404
# (NF = Not Found)
RewriteCond %{REMOTE_ADDR} ^(?!24\.132\.(\d+)\.(\d+))
RewriteRule ^/.*$ - [NF]

例子2,二级域名访问不同目录

RewriteEngine ON
RewriteLog c:\inetpub\iirfLogs\iirf
RewriteLogLevel 1
StatusInquiry ON

# +++++++++++++++++++++++++++++++++

RewriteCond %{HTTP_HOST}   ^alias1\.domain\.com$  [I]
ProxyPass ^/(.*)$          http://internal-server1/$1

RewriteCond %{HTTP_HOST}   ^alias2\.domain\.com$  [I]
ProxyPass ^/(.*)$          http://internal-server2/$1

RewriteCond %{HTTP_HOST}   ^alias3\.domain\.com$  [I]
ProxyPass ^/(.*)$          http://internal-server3/$1

例子3,老域名301到新域名

RewriteLog c:\logs\iirf
RewriteLogLevel 1
IterationLimit 10
MaxMatchCount 10
RewriteEngine ON
StatusInquiry ON

# With a request like http://olddomain.com/Alpha.htm or http://olddomain.com/Alpha.asp (or
# if the olddomain is prefixed with www) , redirect (HTTP 301)
# the request to http://www.domain.com/Alpha.aspx

RewriteCond  %{HTTP_HOST}            ^(www\.)?olddomain\.com$
RedirectRule ^/(.+)\.(htm|asp)$       http://www.newdomain.com/$1.aspx         [R=301]

此条目发表在article分类目录。将固定链接加入收藏夹。