在项目中经常要进行如下映射
将
http://onewww.net/a.aspx?name=llinzzi
映射到
http://onewww.net/llinzzi
首先要解决2个问题
第一是支持通配符的映射URL映射是asp.net2.0新增的功能,不支持通配符
于是采用了NBEAR的NBear.Web.Modules.UrlRewriteRules进行通配符映射
<?xmlversion="1.0"?>
<>
<configurationxmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<configSections>
<sectionname="UrlRewriteRules"type="NBear.Web.Modules.UrlRewriteRules,NBear.Web"/>
</configSections>
<UrlRewriteRules>
<Rulekey="/(.*)/"value="/a.aspx?name=$1"/>
<Rulekey="/(.*)"value="/a.aspx?name=$1"/>
</UrlRewriteRules>
<appSettings/>
<system.web>
<sessionStatetimeout="200"/>
<httpModules>
<addtype="NBear.Web.Modules.UrlRewriteModule,NBear.Web"name="UrlRewriteModule"/>
</httpModules>
<>
<compilationdebug="true"defaultLanguage="c#"/>
<>
<authenticationmode="Windows"/>
<>
</system.web>
</configuration>
vs2005里进行测试成功,但放到IIS里失败
检查了几次,没发现问题,仔细想了想
先了下,iis的工作流程应该是遇到.aspx扩展名,交给.net处理,然后才能调用httpModules进行url映射
http://onewww.net/llinzzi
没有aspx扩展名,所以iis直接当成文件架,返回404错误了
而vs2005里的调试web服务器把所有的请求都发给了.net处理,所以成功.
于是更改映为
<Rulekey="/(.*)/index.aspx"value="/a.aspx?name=$1"/>
浏览
http://onewww.net/llinzzi/index.aspx
测试成功.
开心,把index.aspx设置成默认文档
测试http://onewww.net/llinzzi/结果还是404错误
想了下iis认为llinzzi文件夹不存在,自然就没用默认文档去访问
郁闷,想了很多方法,均失败
难道要用llinzzi/index.html访问?难道要生成真是存在的文件夹?
都不是理想的方案
在尝试从iis里的主目录里的配置里修改isapi来实现用文件夹对iis的解析的时候,突然发现windows2003服务器上的iis7对比我工作机xp上的iis6多了一个名为
通配符应用程序映射的设置,眼睛一亮..有戏,第一名字听起来有门,第二2003本来就是为.net打造的.于是点插入,
输入c:windowsmicrosoft.netframeworkv2.0.50727aspnet_isapi.dll
测试,成功!
搜索了下关于通配符应用程序映射的资料
安装通配符应用程序映射
在IIS6.0中,管理员可以在每次开始对网站或虚拟目录发送请求时,将该网站或虚拟目录配置为运行Internet服务器API(ISAPI),而不管所请求文件的扩展名。
当IISWeb服务器接受到来自客户端的请求时,Web服务器会查看在请求中命名的文件扩展名,以确定有哪一个ISAPI或公共网关接口(CGI)应用程序来处理该文件。例如,如果请求名为Default.asp的网页时,IIS可以从应用程序映射列表中知道Default.asp由Asp.dllISAPI应用程序处理。
如果想在所请求的页面发送到映射的应用程序前对每次客户端请求执行特定的任务,可以编写一个ISAPI筛选器在请求到达时将其截获。但是,ISAPI筛选器具有以下限制:
它们不能访问请求主体,而只访问头。
它们只能在每个站点配置,而不能在每个虚拟目录配置。
它们不应包含长期运行的操作,因为ISAPI筛选器是同步进行的。
它们的灵活性较小,因为ISAPI筛选器API的功能比ISAPI扩展API少,后者用于编写ISAPI应用程序。
它们在时间上难以管理。
它们是事件驱动的。
通过使用通配符应用程序映射,您可以在所请求的页面发送到其映射应用程序之前截获每个请求。其效果就像拥有处理每个文件名扩展的应用程序映射。这就是使用“通配符”来命名这一功能的原因。使用通配符应用程序映射的应用程序只能是ISAPI应用程序。
客户端请求采用以下路由:
传入的请求由安装在根网站上的任何现有的ISAPI筛选器处理。ISAPI筛选器依次执行。
请求被发送到任何现有的通配符应用程序映射的应用程序,这些程序也是依次执行的。如果传入的请求是对虚拟目录中的Web文件进行请求的,且通配符应用程序映射已安装在了该虚拟目录和根网站上,那么只有安装在该虚拟目录的通配符应用程序映射才被执行。如果该虚拟目录上没有安装通配符应用程序映射,则将执行安装在网站上的通配符应用程序映射。换句话说,通配符应用程序映射只在所请求的Web文件所处的应用程序中不存在映射时才会被继承。
IIS服务器会查看应用程序映射表,以确定由哪个ISAPI应用程序或CGI脚本专门处理所请求的文件。
每个阶段都可以附加响应,然后传回给客户端。
使用通配符应用程序映射
通配符应用程序映射可以在以下方案中使用:
高安全性Web应用程序(如银行业应用程序)要求对每个提出请求的用户根据用户名、密码和帐户号数据库进行身份验证。例如,一旦用户通过了身份验证,将会创建规定用户可以访问哪些信息的特定规则。如果通配符应用程序映射确定用户不具有相应权利,它可以阻止请求的进一步访问,或将请求发送到所请求的网页以外的网页。这种自定义的身份验证和授权方案可以在ISAPI应用程序中执行,并安装为通配符应用程序映射。这样,所有用户必须通过身份验证,不考虑他们所请求的文件的扩展名。
针对单个用户的广告电子商务网站。例如,当返回用户所提出的请求时,通配符应用程序映射应用程序将检查他们的身份,然后查询他们以前已观看或购买的项目。一旦通配符脚本映射将控制传送到被请求的页面,就可以显示适合该用户的广告。
要点您必须是本地计算机上Administrators组的成员或者必须被委派了相应的权限,才能执行下列步骤。作为安全性的最佳操作,请使用不属于Administrators组的帐户登录计算机,然后使用运行方式命令以管理员身份运行IIS管理器。在命令提示符下,键入runas/user:administrative_accountname"mmc%systemroot%system32inetsrviis.msc"。
将通配符应用程序映射添加到Web服务器或网站
在IIS管理器中,展开本地计算机,展开“网站”文件夹,右键单击所需的网站或虚拟目录,然后单击“属性”。
单击相应的选项卡:“主目录”、“虚拟目录”、或“目录”。
在“应用程序设置”区域中,单击“配置”,然后单击“映射”选项卡。
要安装通配符应用程序映射,请进行以下操作:
在“映射”选项卡上,单击“插入”。
在“可执行文件”文本框中键入DLL的路径或单击“浏览”以找到该文件,如果该DLL文件是脚本引擎,选择“应用程序引擎”复选框,然后单击“确定”。
要编辑或删除通配符应用程序映射,请进行以下操作:
在“应用程序扩展”列表中,单击想更改的脚本映射。
单击“编辑”更改脚本映射,或单击“删除”删除脚本映射。
要更改通配符应用程序执行的顺序,在“通配符应用程序映射(执行顺序)”框中重新安排通配符应用程序映射,其方法是单击“上移”或“下移”按钮直到符合您想要的顺序为止。
注意请不要在通配符应用程序映射列表中多次列出同一应用程序。