IIS网址重写插件IIRF(Ionic’s Isapi Rewrite Filter)的介绍和使用方法

介绍

IIRF(Ionic's Isapi Rewrite Filter)是一款开源的重写URL过滤器,类似于Apache的URL重写,基于VC8.0(可以用Visual Studio2005或Visual C++ 2005 Express重新编译)开发。它可以运行在IIS5.0至IIS7.0,支持ASP,ASP.NET(ASPX),PHP等许多格式。相对比ASP.NET2.0自带的URL重写,具有更好的性能和许多我们所需要特性,重要的一点在于:它可以支持无扩展名的URL(例如:www.x2009.net/****,你无需在创建一个默认的default.aspx文件,IIRF自动会帮你解析),让URL更加的方便我们记忆,也能进一步提高搜索的排名?IIRF能够在aspnet_isapi提前捕获我们所请求的URL进行处理,如果我们访问www.x2009.net/a.aspx,需要获取www.x2009.net/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 <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一样,只不过是格式不一样而已。

格式

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

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

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

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

默认下IIRF的url-pattern,replacement-string正则的前面已经带了主机头的。

为了方便描述,直接看几个示例(以下示例基本全部来源IIRF文档)

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

源:https://www.x2009.net/original/index.php

目标:https://www.x2009.net/modified/index.aspx

RewriteRule  ^/dinoch/album/([^/]+)/([^/]+).(jpg|JPG|PNG)   /chiesa/pics.aspx?d=$1&p=$2.$3

源:https://www.x2009.net/dinoch/album/30/1.jpg

目标:https://www.x2009.net/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]

源:https://www.x2009.net/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} 日志的等级

IIS站点/虚拟目录中访问共享目录(UNC)以及建立后的应用程序的信任级别问题

UNC是 Universal Naming Convention 的简称,也叫通用命名规范、通用命名约定。
网络(范指局域网)上资源的完整位置名称。
格式为 \\servername\sharename ,其中 servername 是服务器名,sharename 是共享资源的名称。
目录或文件的 UNC 名称可以包括共享名称下的目录路径,如:\\servername\sharename\directory\filename
亦可作为 \\serverip\sharename 格式,其中 serverip 是服务器的IP地址,sharename 是共享资源的名称。
同样也可以包括共享名称下的目录路径,如:\\serverip\sharename\directory\filename

本文重点描述如何使用IIS访问共享资源来架设站点或执行 ASP.Net 等脚本。

通常情况下,拥有多台服务器的朋友在使用IIS建立站点的时候,会遇到如何把多台服务器的资源合并到一起的问题。如何让A服务器的站点,访问B服务器内的资源(如:音乐、视频等)。
当然,我们可以使用 http 协议来实现。在B服务器内建立一个资源站点,然后A服务器的站点直接通过http方式请求B服务器内的资源站点来获得资源,有时候这样做不是我们想要的效果。
设想,能否将B服务器的资源共享到A服务器中来,作为A服务器站点中的一个虚拟目录呢?
Linux中,我们可以使用 NFS 很方便的达到这个目的,同样,在IIS中也是同样可行的,请见下文中的详细描述。

准备工作
1.共享资源服务器为 ShareServer,IP地址为:192.168.100.10;
2.Web服务器为 WebServer,IP地址为:192.168.100.20

详细步骤:
一、共享账户的建立
1.在 WebServer 上建立一个用户名,方便使用该用户读取 ShareServer 上的共享目录,为了web文件能正常运行,同时又避免使用户拥有过高的权限,我们可以直接把该用户归入 Guests(win2003中) 组,或者 IIS_IUSRS(win2008中) 组内,这样就一举多得了。我这里建立的用户名为 IIS_ShareUser ,密码为 123456;
2.在 ShareServer 中也建立一个同名同密码的用户(必须一致,否则在UNC验证的时候会无法登陆)。这里用户名也应该为 IIS_ShareUser ,密码为 123456,也归入Guests组中;

二、共享位置的建立
1.ShareServer 中使用文件夹共享工具,共享出一个目录,共享名为 public ,共享权限设置为 Administrators 组 读取+写入,IIS_ShareUser 用户 读取(如果需要存东西,就加上 写入 权限);
这里 Administrators 用户必须拥有 读取+写入 权限,否则在 WebServer 里使用IIS直接设置的时候会提示无法保存设置。
共享位置的文件夹安全设置也必须加入 IIS_ShareUser 的 读取运行 权限,另外还需要加入IIS进程用户的 读取运行 权限,这里不再描述运行IIS站点所需要的 文件夹安全 权限设置。

三、IIS中引用共享目录
1.WebServer 中IIS里建立站点或虚拟目录,路径指向 \\192.168.100.10\public ,连接认证用户手动输入为 IIS_ShareUser ,密码 123456。
当第1步完成的时候,您已经通过web方式访问该站点或虚拟目录中的来自 ShareServer 共享目录的资源,但是 ASP.Net 还没有权限执行。
2.ASP.Net的权限设置
从站点根目录下打开 web.config 文件,在 <system.web> 节点以内,加入以下内容:
<identity impersonate="true" userName="IIS_ShareUser" password="123456" />
其实就是修改了 ASP.Net 执行的认证方式,把认证方式修改为 ASP.Net模拟用户 ,这样就能让 ASP.Net 通过刚才建立的共享账号执行和访问 ShareServer 中的资源了。

以上摘自[这里]

但是! 这还只是可以访问资源文件,对于aspx这样的需要执行的文件来说,还会出现应用程序的信任级别问题,说信任已失效之类的错误.

MS的网站上给出来解决方法,

http://support.microsoft.com/default.aspx?id=320268

可能对于其他人来说可以执行成功, 因为在网上也看到很多人发了日志出来. 但对于我来说, 怎么也成功不了.

后来找了很多资料, 发现原来还差一个参数.

c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\caspol.exe -m -ag 1 -url "file:////\\ computername \ sharename \ *"FullTrust -exclusive on 以上是MS站上给出的命令, 以下是我的(注意红色的参数): c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\caspol.exe -q -m -ag 1 -url "file:////\\ computername \ sharename \ *"FullTrust -exclusive on

搞了一晚上终于搞定了. 立即记下来. 呵呵

netsh命令使用说明和使用netsh修改IP、网关、DNS

进入ip设置模式
在dos环境中,设置网络参数之前,必须先进入IP设置模式才可以。先打开系统运行对话框,执行"CMD"命令,将主界面切换到DOS环境中,在命令行中输入"netsh"命令,单击回车键后,DOS命令提示符将自动变为"netsh>",再依次执行"Interface"|"IP"命令后,DOS命令提示符就会变成"Interface ip>",此时你就进入了IP设置模式。在该模式下,你可以利用"set"命令设置网络IP地址、网络掩码、DNS服务器,也可以利用"show"命令,查看各种网络参数,包括与本机建立的各种TCP/IP连接等。

设置IP地址
在IP设置模式下,执行"set address name static [addr] [mask] [gateway] [gwmetric]"命令,就能给指定网络连接分配IP地址、掩码地址、网关地址。其中,"set address"是设置IP地址的专用命令,name表示指定的网络连接名称,Win2000下的name应设置为"Internet连接",WinXP、Win2003下的name应设置为"本地连接";static是表示设置静态地址,"[addr]"指的是具体IP地址,"[mask]"指的是具体掩码地址,"[gateway]"指的是具体网关地址,"[gwmetric]"指的是具体网关跃点数,一般情况下,该数值应设置为"1"。
设置DNS服务器

在IP设置模式下,你还能为指定的网络连接设置DNS服务器,只要执行"set dns name static [addr]"命令就可以了。其中"set dns"是设置DNS服务器的专用命令,"static"表示设置静态DNS服务器,"[addr]"是具体的DNS服务器IP地址。

例如,现在要将当前计算机的DNS服务器,设置为"202.100.100.202"时,那么你可以在IP设置模式下,输入字符串命令"set dns Internet连接 static 202.100.100.202",单击回车后,系统将返回"确定"提示,这表明配置静态DNS服务器已经成功。此时,你可以执行"show dns"命令,看看当前计算机的DNS服务器,是否已经被设置成指定的IP地址了。

倘若需要为计算机启动动态DNS服务器时,可以执行"set dns Internet连接 source=dhcp"命令。

查询配置信息
大家知道在DOS环境中,利用"Ipconfig"命令,也能查看到当前计算机的网络配置信息,可是该命令查看到的信息很有限,只限于IP地址、掩码地址、网关地址等。而在IP设置模式下,你能查看到各种网络配置信息。例如,执行"show config"命令后,你除了可以看到"Ipconfig"命令能查询的信息外,还能知道网关跃点数是多少,DNS服务器是什么,WINS服务器是什么等。

执行"show tcpconn"命令,你能查看到当前有哪些Internet主机,与本地机器建立了连接,也可以查看到本地端口的工作状态,是处于关闭状态还是监听状态。

灵活运用该命令,你能及时发现系统是否受到了外来入侵,要是有陌生的主机与本地主机的陌生端口,建立了连接时,那系统十有八九受到了攻击,此时你必须尽快采取措施,确保系统安全。

当然,Netsh还为你提供了许多查询网络信息的命令,例如查询IP统计信息的命令,查询TCP统计信息的命令,查询UDP、ICMP统计信息的命令等,这些命令使用都比较简单,在这里就不一一详细介绍了。

快速修改配置
倘若你的笔记本电脑,需要在不同的网络环境中工作,那么每次工作之前,总需要重新修改网络参数,这实在太麻烦了。现在,你可以在Netsh模式下,很轻松地实现快速修改网络配置的目的,具体步骤为:

在DOS命令行状态下,输入字符串命令"netsh -c interface dump>c:\net1.txt",单击回车键后,当前工作站的网络配置信息,就全部被保存到C盘net1.txt文件中了(该文件保存着网络1环境中的上网参数);下面,打开net1.txt文件,你可以看到如图5所示的配置信息,包括工作站的IP地址、掩码IP地址、网关IP地址等。现在,你可以用笔记本电脑可能使用到的其他网络环境中的配置参数,替换这里的对应参数,其余内容保持不变,然后再将该文本文件另存为"net2.txt"(该文件保存着网络2环境中的上网参数);同样地,你可以生成net3.txt、net4.txt......netn.txt,让这些文件保存着网络3、网络4......网络n环境中的上网参数。

以后,笔记本电脑无论接入到哪个网络环境中,只要在DOS命令行状态下,执行"netsh exec c:\netn.txt"命令,就能实现快速修改网络配置的目的了(这里的"netn.txt"文件,必须对应着指定的网络环境)

附修改IP,网关,DNS的实例:
修改IP:
netsh interface ip set address name="本地连接" source=static addr=ip地址mask=子网掩码
修改网关:
netsh interface ip set address name="本地连接" gateway=网关地址 gwmetric=0
修改DNS:
netsh interface ip set dns name="本地连接" source=static addr=主DNS
netsh interface ip add dns name="本地连接" addr=辅DNS