IIRF简单应用
2015-09-09 17:40
295 查看
Ionic’s Isapi Rewrite Filter(IIRF)配置详解
对于ISAPI Rewrite我想大家再熟悉不过了,它的伪静态URL重写功能已经被广大服务器所应用,但是ISAPI Rewrite不是免费的,那么有没有一款软件功能与ISAPI Rewrite相同,但又是免费的呢,而今答案是肯定的,Ionic’s Isapi Rewrite Filter 就是一款就可以实现ISAPI Rewrite相同的功能并且又是免费的,同时,IIRF可以完美的支持IIS下多站点的伪静态,可以定义一个所有站点共用的全局规则、以及对每个站点分别定义规则。其规则与apache下的规则基本上完全一致,当然与ISAPI
Rewrite也高度兼容,完全可以替代“ISAPI Rewrite”。简称:IIRF。下面就对此做初步介绍。
Ionic’s Isapi Rewrite Filter 官方网站:http://iirf.codeplex.com
下载地址:http://iirf.codeplex.com/releases/view/14394
官方使用在线帮助手册:http://cheeso.members.winisp.net/Iirf20Help/frames.htm
一、安装IIRF
1、复制IIRF的DLL(IIRF.dll)到相应的文件夹,如D:/Rewrite,或者,它可以在一个完全不同的目录树。
2、如果您创建一个服务器全局范围的设置文件(iirfglobal.ini),你必须把它与(iirf.dll)文件在同一目录中。 该URL Rewrite筛选器将寻找其在该文件中的全局设置文件。 如果是多个站点,则在站点更目录下创建(iirf.dll)文件。
3、对(iirf.dll)所在目录赋予IIS_WPG用户组“读取”、“读取与运行”、“写入”权限。
4、 打开Internet信息服务管理器。右键点击IIS管理器左栏“网站”->“属性”,弹出“网站属性”选项卡,选择“ISAPI筛选器”,如下图添加IIRF。
5、重启IIS
6、右键点击IIS管理器左栏“网站” ->“属性”,弹出“网站属性”选项卡,选择“ISAPI筛选器”,查看“IIRF”加载是否成功。若是绿色向上箭头,则表示加载成功。
二、规则文件格式基本照搬ISAPI Rewrite,要作修改
RewriteRule [源URL正则条件] [目的URL]
ISAPI Rewrite与IIRF的区别就在[目的URL],ISAPI Rewrite的要转义,而IIRF不用转义。
如果网上有现成的ISAPI Rewrite的规则可以直接复制过来,将[目的URL]中的反斜杠()一个个删除就可以用在IIRF中用了。
知道这个之后,你就可以随便在网上与人交流,按ISAPI Rewrite交流,最后把转义符()删掉就行了。
三、日志设置
在IIRF中日志值可以设置为0-5,在规则文件的开头部分有两行设置日志类型
RewriteLog C:RewritesupesiteiirfLog.out (注意要写清楚路径,各站点不同)
RewriteLogLevel 0 (0为不记类,3为一般测试,5为处理故障)
日志的代价高昂,同时不会自动删除文件,日志类型一定要设成0,除非用于检查才能修改为其他值,检查完后一定要改为0,否则日志文件把硬盘占满就麻烦了。
如果日志不为0,筛选器起用后,对应文件夹会产生类似以下的文件,是文本格式的,可以用记事本查看。
iirfLog.out.12345.log
四、查看配置
在IIRF.ini文件中输入以下配置参数,则可通过浏览器方便查看目前IIRF配置
StatusUrl iirfStatus
StatusInquiry ON
在浏览器中输入http://localhost/iirfstatus,即可查看。
五、规则文件可随时修改,随时生效!
六、附上WordPress的IIRF规则
先到WordPress后台设置固定连接为:/post/%post_id%.html
然后在WordPress所在网站的根目录创建(iirf.ini)文件,并在文件中加入以下规则:
IIRF.ini文件配置说明
正则
正则的语法跟.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的值就可以了。
对于ISAPI Rewrite我想大家再熟悉不过了,它的伪静态URL重写功能已经被广大服务器所应用,但是ISAPI Rewrite不是免费的,那么有没有一款软件功能与ISAPI Rewrite相同,但又是免费的呢,而今答案是肯定的,Ionic’s Isapi Rewrite Filter 就是一款就可以实现ISAPI Rewrite相同的功能并且又是免费的,同时,IIRF可以完美的支持IIS下多站点的伪静态,可以定义一个所有站点共用的全局规则、以及对每个站点分别定义规则。其规则与apache下的规则基本上完全一致,当然与ISAPI
Rewrite也高度兼容,完全可以替代“ISAPI Rewrite”。简称:IIRF。下面就对此做初步介绍。
Ionic’s Isapi Rewrite Filter 官方网站:http://iirf.codeplex.com
下载地址:http://iirf.codeplex.com/releases/view/14394
官方使用在线帮助手册:http://cheeso.members.winisp.net/Iirf20Help/frames.htm
一、安装IIRF
1、复制IIRF的DLL(IIRF.dll)到相应的文件夹,如D:/Rewrite,或者,它可以在一个完全不同的目录树。
2、如果您创建一个服务器全局范围的设置文件(iirfglobal.ini),你必须把它与(iirf.dll)文件在同一目录中。 该URL Rewrite筛选器将寻找其在该文件中的全局设置文件。 如果是多个站点,则在站点更目录下创建(iirf.dll)文件。
3、对(iirf.dll)所在目录赋予IIS_WPG用户组“读取”、“读取与运行”、“写入”权限。
4、 打开Internet信息服务管理器。右键点击IIS管理器左栏“网站”->“属性”,弹出“网站属性”选项卡,选择“ISAPI筛选器”,如下图添加IIRF。
5、重启IIS
6、右键点击IIS管理器左栏“网站” ->“属性”,弹出“网站属性”选项卡,选择“ISAPI筛选器”,查看“IIRF”加载是否成功。若是绿色向上箭头,则表示加载成功。
二、规则文件格式基本照搬ISAPI Rewrite,要作修改
RewriteRule [源URL正则条件] [目的URL]
ISAPI Rewrite与IIRF的区别就在[目的URL],ISAPI Rewrite的要转义,而IIRF不用转义。
如果网上有现成的ISAPI Rewrite的规则可以直接复制过来,将[目的URL]中的反斜杠()一个个删除就可以用在IIRF中用了。
知道这个之后,你就可以随便在网上与人交流,按ISAPI Rewrite交流,最后把转义符()删掉就行了。
三、日志设置
在IIRF中日志值可以设置为0-5,在规则文件的开头部分有两行设置日志类型
RewriteLog C:RewritesupesiteiirfLog.out (注意要写清楚路径,各站点不同)
RewriteLogLevel 0 (0为不记类,3为一般测试,5为处理故障)
日志的代价高昂,同时不会自动删除文件,日志类型一定要设成0,除非用于检查才能修改为其他值,检查完后一定要改为0,否则日志文件把硬盘占满就麻烦了。
如果日志不为0,筛选器起用后,对应文件夹会产生类似以下的文件,是文本格式的,可以用记事本查看。
iirfLog.out.12345.log
四、查看配置
在IIRF.ini文件中输入以下配置参数,则可通过浏览器方便查看目前IIRF配置
StatusUrl iirfStatus
StatusInquiry ON
在浏览器中输入http://localhost/iirfstatus,即可查看。
五、规则文件可随时修改,随时生效!
六、附上WordPress的IIRF规则
先到WordPress后台设置固定连接为:/post/%post_id%.html
然后在WordPress所在网站的根目录创建(iirf.ini)文件,并在文件中加入以下规则:
RewriteLogLevel 0 RewriteLog E:/flyingbluelogfilesIIRFLOGlog StatusUrl iirfStatus StatusInquiry ON RewriteRule /index.html$ /index.php [L] # # from accessing through HTTP # # WordPress rewrite rules # # Below is for permalink like /post/%post_id%.html # # Provided By Sideblue # # URL:http://ivup.cn RewriteCond %{REQUEST_FILENAME} ^wp-content.* RewriteCond %{REQUEST_FILENAME} ^wp-admin.* RewriteCond %{REQUEST_FILENAME} ^wp-include.* RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule /post/tag/(.*) /index.php?tag=$1 RewriteRule /tag/(.*) /index.php?tag=$1 RewriteRule /(contact|about-copyright|favor|archives|tags|sitemap) /index.php?pagename=$1 RewriteRule /post/category/(.*)/(feed|rdf|rss|rss2|atom)/?$ /wp-feed.php?category_name=$1&feed=$2 RewriteRule /post/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]+)/?([0-9]+)?/?$ /index.php?p=$1&page=$2 # RewriteRule /post/([0-9]+)/?([0-9]+)?/?$ /index.php?p=$1&page=$2 RewriteRule /post/([0-9]+).html /index.php?p=$1 RewriteRule /page/(.*)/?s=(.*) /index.php?s=$2&paged=$1 RewriteRule /page/(.*) /index.php?paged=$1 RewriteRule /post/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 /post/date/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$ /index.php?year=$1&monthnum=$2&day=$3&page=$4 RewriteRule /post/date/([0-9]{4})/([0-9]{1,2})/?$ /index.php?year=$1&monthnum=$2&page=$3 RewriteRule /post/([0-9]+).html/(feed|rdf|rss|rss2|atom) /index.php?feed=rss2&p=$1 RewriteRule /post/([0-9]+).html/trackback /wp-trackback.php?p=$1
IIRF.ini文件配置说明
正则
正则的语法跟.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的值就可以了。
相关文章推荐
- Java代理的模拟
- 软工视频(二)——软件计划
- HTTP协议
- [Android]应用语言切换的三种方法
- Flask-在浏览器中直接显示文本文件中的内容
- java2
- 显示执行时间
- mysql常用函数
- Redis学习1之redis单节点的安装和使用
- 在没有域环境的情况下配置完整安装的SharePoint2010和2013
- 华为OJ2288-合唱队(最长递增子序列)
- nyoj 21 三个水杯 【bfs变形(好题)】
- Activity切换之overridePendingTransition初探
- red5 使用自带的直播程序案例延时问题处理
- C#日期格式化
- 返回顶部的3中方法(解决移动端使用zepto没有滑动的效果)
- 0909第一次作业
- svn系列之四svn基本操作——检出项目
- mac系统如何显示和隐藏文件
- hdu1907John尼姆博弈