IIS中的URL重写

Technorati 标签: IIS, ISAPI_Rewrite, URL重写

1.  概述

 

   突然间接到了一个任务,将URL中的一个字段都转成另一个字段,然后再重新发送到Server端,例如将http://***/GEO/***转换成http://***/ArcGIS/***,然后再转发到Server端,上网查了一下资料,突然发现这里面有很大的研究空间,现在在这里学习一下。

   所谓的URL重写就是截取传入Web请求并自动将请求重定向到其他URL71310de.gif过程,比如浏览器发来请求hostname/101.aspx71310dou.gif服务器自动将这个请求中定向为http://hostname/list.aspx?id=101,url重写的优点在于:

   1.缩短url71310dou.gif隐藏实际路径提高安全性

   2.易于用户记忆和键入

   3.易于被搜索引擎收录

    一般常用的URL重写方式有ISAPI重写,.NET重写等。在这里我首先对ISAPI重写方式进行学习和总结,然后再对.NET重写的方式进行学习总结。

 

2.  ISAPI方式重写URL

 

    在ISAPI方式重写URL中有两款好用的第三方插件可以供我们选择,两款服务器扩展插件都有各自的拥护者,通过笔者的试用,各有千秋。

一种是ISAPI_Rewrite,

下载地址在:http://www.helicontech.com/download/

    这里只有ISAPI Rewrite的一个LITE版本是免费的,其它都是trial版本。ISAPI Rewrite Lite的版本功能不支持虚拟站点配置,元数据监测和自动缓存清理。 但是基本的UrlRewrite功能都支持。该款服务器扩展插件是利用正则表达式来进行替换规则的控制。

另一种是IIRF(为了方便少写几字,以后的Ionic’s Isapi Rewrite Filter将全部简写),

下载地址在:http://iirf.codeplex.com/

    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跟重写URL一样,它也是基于正则的方式来匹配,具有LOG记录,请求的条件判断。还是进入正题吧。

 

2.1  IIRF

 

2.1.1 安装

 

    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. 完成。

 

2.1.2  日志


    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),包括日志文件更改的事件,建议方便调试的时候使用。

 

2.1.3  正则

 

    正则的语法跟.NET一样,只不过是格式不一样而已。所以我也不在详细介绍。具体有关正则的说明大家可以google一下。

 

2.1.3.1  RewriteRule

 

RewriteRule <url-pattern> <replacement-string>   [<modifiers>]

url-pattern:匹配的正则表达式(必需)

replacement-string:要替换的字符串(必需)

modifiers:有关对RewriteRule的操作标记。可选选项。在下面我会说明

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

例1

RewriteRule  ^/original/(.*).php  /modified/$1.aspx

源:http://xxx/original/index.php

目标:http://xxx/modified/index.aspx

例2

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])。

1.[R]  or [R=code]

R = Redirect(URL跳转到<replacement-string>地址

就像我们在.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

2.[NF]

NF = Not found(返回404错误给用户,但该文件并未移除,还是保留在网站中)

它还可以跟RewriteCond一起配合,来实现自定义的404错误请求。特别要注意,你所要匹配的文件必须存在,替换的字符串不允许是存在文件名

RewriteRule ^/1008.aspx$ /1.aspx [NF]

1008.aspx文件需要存在,1.aspx不存在,否则无法正常达到我们的结果。

3.[L]

L = Last test if match(如果已经匹配,将不在继续匹配下去)

4.[F]

F = Forbidden(跟NF标志相似,)

5.[I]

I = Do case-insensitive matching 模糊匹配

6.[U]

U = Store original url in server Variable HTTP_X_REWRITE_URL(保存原始的url到HTTP_X_REWRITE_URL服务器变量中。)

    保存原始的url到HTTP_X_REWRITE_URL服务器变量中。在ASP.NET你可以用Request.ServerVariables["HTTP_X_REWRITE_URL"]获取原始值。

 

2.1.3.2  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的功能上来说,确实很灵活另外。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] )

    如果URL是以htm,php,html(模糊匹配),

(2)RewriteCond %{REQUEST_FILENAME}                      !-f

    URL不是存在文件

(3)RewriteCond %{REQUEST_FILENAME}                      !-d

    URL不是请求的路径                                

(4)RewriteRule ^.*$                      /index.aspx                      [U,L]

     将所有请求跳转到index.aspx,保存原始的URL,之后不在对此进行匹配

再如,

RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla.*

RewriteRule  ^/$                 /homepage.max.html  [L]

 

2.1.3.3  IIRF其它配置属性

 

IterationLimit {integer} 从指定的integer后开始匹配RewriteRule组。如果超出RewriteRule个数,默认将会从第8个开始。

MaxMatchCount {integer} RewriteRule组的总个数。

RewriteLog <filename stub> 日志路径。

RewriteLogLevel {0,1,2,3,4,5} 日志的等级。

2.2  ISAPI_Rewrite

   

 

参考资料

 

http://msdn.microsoft.com/zh-cn/library/ms972974.aspx#XSLTsection123121120120

http://blog.sina.com.cn/s/blog_4027f79a0100dy8t.html

http://www.cnblogs.com/yiki/archive/2009/04/14/1435504.html

http://blog.joycode.com/scottgu/archive/2007/03/01/94004.aspx

http://www.theserverside.net/tt/articles/showarticle.tss?id=IIS_ASP

转载于:https://www.cnblogs.com/Aragon/archive/2010/03/10/1682708.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值