|
 |
栏目导栏 |
|
| |
|
|
|
|
 |
资料搜索 |
|
| |
|
|
|
|
 |
热门文章 |
|
| |
|
|
|
|
 |
最新文章 |
|
| |
|
|
|
| |
| |
|
|
|
| |
| IIRF(Ionic's Isapi Rewrite Filt er)入门,在IIS上重写U |
|
每一次看scottgur的BLOG总能收获意外的惊喜^_^。在他的这篇BLOG(Tip/Trick: Url Rewriting with ASP.NET(感谢思归)中,描述了有关在ASP.NET重写URL的各种方法。而我这篇文章不会涉及如何在ASP.NET重写URL,只是简单介绍IIRF(为了方便少写几字,以后的Ionic's Isapi Rewrite Filter将全部简写)如何在IIS下面实现URL的重写。 VC8Linux联盟 VC8Linux联盟 介绍 VC8Linux联盟 VC8Linux联盟 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是无法实现的。 VC8Linux联盟 VC8Linux联盟 IIRF跟ASP.NET重写URL一样,它也是基于正则的方式来匹配,具有LOG记录,请求的条件判断。还是进入正题吧。 VC8Linux联盟 VC8Linux联盟 安装 VC8Linux联盟 VC8Linux联盟 IIRF安装需要我们手动操作来完成。不过。也是很方便了。 VC8Linux联盟 VC8Linux联盟 1 将IsapiRewrite4.dll, IsapiRewrite4.ini复制到c:\windows\system32\inetsrv(你也可以复制到其它适当的文件夹下面)。 VC8Linux联盟 VC8Linux联盟 IsapiRewrite4.ini是IIRF配置文件,每次该文件更改之后,IIRF会自动重新加载该文件,无需重启IIS来重新加载配置,如果您修改后INI文件后格式不正确,IIRF将会自动获取最后正确加载的配置文件。 VC8Linux联盟 VC8Linux联盟 2 打开IIS管理器,选择“默认网站”,右击“属性”,选择“ISAPI筛选器”,点击“添加”,输入筛选器名称:Ionic Rewriter,可执行文件选择上面复制到c:\windows\system32\inetsrv下面的IsapiRewrite4.dll文件,点“确定”。 VC8Linux联盟 VC8Linux联盟 3重启IISADMIN service服务。(在计算机管理----windows服务里面) VC8Linux联盟 VC8Linux联盟 4 完成。 VC8Linux联盟 VC8Linux联盟 日志 VC8Linux联盟 VC8Linux联盟 IIRF能够将INI配置文件加载,用户的URL请求记录都会保存到指定的日志文件里。因为它具有很大的性能开销,因此建议将它日志的记录等级设为0,只有 VC8Linux联盟 为了方便调试的时候时候,可以设置为5, VC8Linux联盟 VC8Linux联盟 RewriteLog <filename stub> 保存的日志路径,如 c:\temp\iirfLog.out VC8Linux联盟 RewriteLogLevel {0,1,2,3,4,5} 日志的等级,默认值为0 VC8Linux联盟 VC8Linux联盟 0 –不会记录日志 VC8Linux联盟 1- 少许的日志 VC8Linux联盟 2- 比较多的日志 VC8Linux联盟 3- 比较详细的日志 VC8Linux联盟 4- 详细的日志(4),并会跟踪server variable和替换的字符串。 VC8Linux联盟 5- 详细的日志(5),包括日志文件更改的事件,建议方便调试的时候使用 VC8Linux联盟 VC8Linux联盟 正则 VC8Linux联盟 VC8Linux联盟 正则的语法跟.NET一样,只不过是格式不一样而已。所以我也不在详细介绍。具体有关正则的说明大家可以用GOOGLE搜索。 VC8Linux联盟 VC8Linux联盟 格式: VC8Linux联盟 RewriteRule <url-pattern> <replacement-string> [<modifiers>] VC8Linux联盟 url-pattern:匹配的正则表达式(必需) VC8Linux联盟 replacement-string:要替换的字符串(必需) VC8Linux联盟 modifiers:有关对RewriteRule的操作标记。可选选项。在下面我会说明 VC8Linux联盟 VC8Linux联盟 VC8Linux联盟 默认下IIRF的url-pattern,replacement-string正则的前面已经带了主机头的。 VC8Linux联盟 VC8Linux联盟 为了方便描述,直接看几个示例(以下示例基本全部来源IIRF文档) VC8Linux联盟 VC8Linux联盟 VC8Linux联盟 RewriteRule ^/original/(.*).php /modified/$1.aspx VC8Linux联盟 VC8Linux联盟 源:http://xxx/original/index.php VC8Linux联盟 VC8Linux联盟 目标:http://xxx/modified/index.aspx VC8Linux联盟 VC8Linux联盟 RewriteRule ^/dinoch/album/([^/]+)/([^/]+).(jpg|JPG|PNG) /chiesa/pics.aspx?d=$1&p=$2.$3 VC8Linux联盟 VC8Linux联盟 源:http://xxx/dinoch/album/30/1.jpg VC8Linux联盟 VC8Linux联盟 目标:http://xxx/chiesa/pics.aspx?d=30&p=1.jpg VC8Linux联盟 VC8Linux联盟 比较简单,主要还在于modifiers的功能。下面列举了它的所有值,允许组合(如[R,L])。 VC8Linux联盟 VC8Linux联盟 R = Redirect(URL跳转到<replacement-string>地址) VC8Linux联盟 NF = Not found(返回404错误给用户,但该文件并未移除,还是保留在网站中) VC8Linux联盟 L = Last test if match(如果已经匹配,将不在继续匹配下去) VC8Linux联盟 F = Forbidden(跟NF标志相似,) VC8Linux联盟 I = Do case-insensitive matching VC8Linux联盟 U = Store original url in server Variable HTTP_X_REWRITE_URL(保存原始的url到HTTP_X_REWRITE_URL服务器变量中。) VC8Linux联盟 VC8Linux联盟 [R] or [R=code] VC8Linux联盟 就像跟我们在ASP.NET使用的Redirect方法一样,重新改变浏览器的方向,跳转到新的指定的URL中。 VC8Linux联盟 [R=code]允许我们指定特定的HTTP状态返回码。只能介于301到399。如果超出这个范围。默认会是使用302状态。 VC8Linux联盟 RewriteRule ^/goto.aspx?r=(.*)$ $1 [R] VC8Linux联盟 源:http://xxx/goto.aspx?r=http://www.google.com/ VC8Linux联盟 目标:http://www.google.com VC8Linux联盟 VC8Linux联盟 [L] VC8Linux联盟 上面已经简单介绍过。不在说明 VC8Linux联盟 VC8Linux联盟 [NF] VC8Linux联盟 上面已经简单介绍过。它还可以跟RewriteCond一起配合,来实现自定义的404错误请求。 VC8Linux联盟 特别要注意,你所要匹配的文件必须存在,替换的字符串不允许是存在文件名 VC8Linux联盟 RewriteRule ^/1008.aspx$ /1.aspx [NF] VC8Linux联盟 1008.aspx文件需要存在,1.aspx不存在,否则无法正常达到我们的结果。 VC8Linux联盟 (很奇怪,我不知道是不是我搞错了。但我最终测试的结果确实是这样,文档也没详细说明过,有知道的朋友可以告诉我一下原因) VC8Linux联盟 VC8Linux联盟 [F] VC8Linux联盟 不在说明。 VC8Linux联盟 VC8Linux联盟 [I] VC8Linux联盟 模糊匹配 VC8Linux联盟 VC8Linux联盟 [U] VC8Linux联盟 保存原始的url到HTTP_X_REWRITE_URL服务器变量中。 VC8Linux联盟 在ASP.NET你可以用Request.ServerVariables["HTTP_X_REWRITE_URL"]获取原始值。 VC8Linux联盟 VC8Linux联盟 RewriteCond VC8Linux联盟 RewriteCond <test-string> <pattern> [<modifier flag[,...]>] VC8Linux联盟 类似于条件判断,并且允许多个条件,OR,AND。只有当RewriteCond的Server Variable 匹配所指定的正则表达,RewriteRule才会执行。比如: VC8Linux联盟 RewriteCond %{REMOTE_ADDR} ^(127.0.0.1)$ VC8Linux联盟 RewriteRule ^/(.*).aspx$ /$1.aspx VC8Linux联盟 如果我们访问网站的地址的IP来源于127.0.0.1,那么,允许 RewriteRule ^/(.*).aspx$ /$1.aspx VC8Linux联盟 VC8Linux联盟 RewriteCond %{REMOTE_ADDR} ^(127.0.0.1)$ [OR] VC8Linux联盟 RewriteCond %{REMOTE_ADDR} ^(192.168.0.10)$ VC8Linux联盟 RewriteRule ^/(.*).aspx$ /$1.aspx VC8Linux联盟 添加了OR来多个条件判断 VC8Linux联盟 VC8Linux联盟 RewriteCond %{REMOTE_ADDR} ^(?!127.0.0.1)([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})(.*)$ VC8Linux联盟 RewriteRule ^/(?!redirected.htm)(.*)$ /redirected.htm VC8Linux联盟 VC8Linux联盟 Modifier flags有二个值 VC8Linux联盟 I=模糊匹配 VC8Linux联盟 OR=逻辑判断 VC8Linux联盟 VC8Linux联盟 从IIRF的RewriteCond的功能上来说,确实很灵活,不知道跟IIS7的重写怎么样,嘻嘻。还没瞧见过呢*^_&。另外。RewriteCond的[Patterns]可以带下面几个参数 VC8Linux联盟 -d VC8Linux联盟 Treats the TestString as a pathname and tests if it exists, VC8Linux联盟 and is a directory. VC8Linux联盟 TestString是一个路径名称,并且存在这个路径 VC8Linux联盟 -f VC8Linux联盟 Treats the TestString as a pathname and tests if it exists and VC8Linux联盟 is a regular file. VC8Linux联盟 TestString是一个路径名称,并且是一个存在的文件 VC8Linux联盟 -s VC8Linux联盟 Treats the TestString as a pathname and tests if it exists and VC8Linux联盟 is a regular file with size greater than zero. VC8Linux联盟 TestString 是一个路径名称,并且存在文件超过0字节 VC8Linux联盟 VC8Linux联盟 如文档所使用的例子 VC8Linux联盟 (1)RewriteCond %{HTTP_URL} (/|\.htm|\.php|\.html|/[^.]*)$ [I] ) VC8Linux联盟 (2)RewriteCond %{REQUEST_FILENAME} !-f VC8Linux联盟 (3)RewriteCond %{REQUEST_FILENAME} !-d VC8Linux联盟 (4)RewriteRule ^.*$ /index.aspx [U,L] VC8Linux联盟 (1)如果URL是以htm,php,html(模糊匹配), VC8Linux联盟 (2)URL不是存在文件 VC8Linux联盟 (3)URL不是请求的路径 VC8Linux联盟 (4)将所有请求跳转到index.aspx,保存原始的URL,之后不在对此进行匹配 VC8Linux联盟 VC8Linux联盟 在如 VC8Linux联盟 RewriteCond %{HTTP_USER_AGENT} ^Mozilla.* VC8Linux联盟 RewriteRule ^/$ /homepage.max.html [L] VC8Linux联盟 VC8Linux联盟 IIRF其它配置属性 VC8Linux联盟 IterationLimit {integer}从指定的integer后开始匹配RewriteRule组。如果超出RewriteRule个数,默认将会从第8个开始。 VC8Linux联盟 MaxMatchCount {integer} RewriteRule组的总个数。 VC8Linux联盟 RewriteLog <filename stub> 日志路径 VC8Linux联盟 RewriteLogLevel {0,1,2,3,4,5} 日志的等级 VC8Linux联盟 VC8Linux联盟 一个常见问题 VC8Linux联盟 在刚安装IIRF之后就测试一下ASP.NET下面的URL,发现还是跟以前ASP.NET重写URL有一样的问题:无法改写Form下面的action的路径,而我们这时使用Request.RawUrl获取原始的URL是为空的。也许你开始注意到了我上面写过的RewriteRule的modifiers选项[U]。我们可以通过将原始的URL保存到服务器变量中。然后通过Request.ServerVariables[name]来获取。然后重写action的值就可以了。 VC8Linux联盟 VC8Linux联盟 代码1 VC8Linux联盟 1 Public Class FormFixerHtmlTextWriterClass FormFixerHtmlTextWriter VC8Linux联盟 2 Inherits System.Web.UI.HtmlTextWriter VC8Linux联盟 3 Private _url As String VC8Linux联盟 4 Public Sub New()Sub New(ByVal writer As TextWriter) VC8Linux联盟 5 MyBase.New(writer) VC8Linux联盟 6 _url = ForumContext.Current.Context.Request.ServerVariables("HTTP_X_REWRITE_URL") VC8Linux联盟 7 End Sub VC8Linux联盟 8 Public Overloads Overrides Sub WriteAttribute()Sub WriteAttribute(ByVal name As String, ByVal value As String, ByVal encode As Boolean) VC8Linux联盟 9 If (Not _url Is Nothing And String.Compare(name, "action", True) = 0) Then VC8Linux联盟 10 value = _url VC8Linux联盟 11 End If VC8Linux联盟 12 MyBase.WriteAttribute(name, value, encode) VC8Linux联盟 13 End Sub VC8Linux联盟 14 End Class VC8Linux联盟 后记: VC8Linux联盟 IIRF已经分析的差不多了。从上面可以看出,功能确实很强大,而且配置也很灵活。发现自己也慢慢喜欢上它了。嘿嘿。重要的是。它是免费,开源的。 VC8Linux联盟 VC8Linux联盟 为自己小小的鼓掌一下。嘻嘻。写这篇随笔真不容易。希望能给大家一个帮助。另外,由于自己水平有限,上面也许有描述错误的地方或不清楚的地方还请指出,有则改之,无则加勉:) VC8Linux联盟
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论 |
|
|
|
|
|