2daye 发表于 2008-2-18 11:35:45

ASP.NET 2.0 中的UrlRewrite

在项目中经常要进行如下映射 <BR>将 <BR>http://onewww.net/a.aspx?name=llinzzi <BR>映射到 <BR>http://onewww.net/llinzzi <BR>首先要解决2个问题 <BR>第一是支持通配符的映射&nbsp;URL映射是asp.net2.0新增的功能,不支持通配符 <BR>于是采用了NBEAR的&nbsp;NBear.Web.Modules.UrlRewriteRules&nbsp;进行通配符映射 <BR><BR><BR>&lt;?xml&nbsp;version="1.0"?&gt; <BR>&lt;!--&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;注意:&nbsp;除了手动编辑此文件以外,您还可以使用&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;Web&nbsp;管理工具来配置应用程序的设置。可以使用&nbsp;Visual&nbsp;Studio&nbsp;中的 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;“网站”-&gt;“Asp.Net&nbsp;配置”选项。 <BR>&nbsp;&nbsp;&nbsp;&nbsp;设置和注释的完整列表在&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;machine.config.comments&nbsp;中,该文件通常位于&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;\Windows\Microsoft.Net\Framework\v2.x\Config&nbsp;中 <BR>--&gt; <BR>&lt;configuration&nbsp;xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"&gt; <BR>&lt;configSections&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;section&nbsp;name="UrlRewriteRules"&nbsp;type="NBear.Web.Modules.UrlRewriteRules,&nbsp;NBear.Web"/&gt; <BR>&nbsp;&nbsp;&lt;/configSections&gt; <BR>&nbsp;&nbsp;&lt;UrlRewriteRules&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;Rule&nbsp;key="/(.*)/"&nbsp;value="/a.aspx?name=$1"&nbsp;/&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;Rule&nbsp;key="/(.*)"&nbsp;value="/a.aspx?name=$1"&nbsp;/&gt; <BR>&nbsp;&nbsp;&lt;/UrlRewriteRules&gt;&nbsp;&nbsp; <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;&lt;appSettings/&gt; <BR><BR><BR><BR><BR>&nbsp;&nbsp;&lt;system.web&gt; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;sessionState&nbsp;timeout="200"&nbsp;/&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;httpModules&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;add&nbsp;type="NBear.Web.Modules.UrlRewriteModule,&nbsp;NBear.Web"&nbsp;name="UrlRewriteModule"/&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/httpModules&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置&nbsp;compilation&nbsp;debug="true"&nbsp;将调试符号插入 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;已编译的页面中。但由于这会&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;影响性能,因此只在开发过程中将此值&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置为&nbsp;true。 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;compilation&nbsp;debug="true"&nbsp;defaultLanguage="c#"&nbsp;/&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过&nbsp;&lt;authentication&gt;&nbsp;节可以配置&nbsp;ASP.NET&nbsp;使用的&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;安全身份验证模式, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以标识传入的用户。&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;authentication&nbsp;mode="Windows"/&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果在执行请求的过程中出现未处理的错误, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;则通过&nbsp;&lt;customErrors&gt;&nbsp;节可以配置相应的处理步骤。具体说来, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;开发人员通过该节可以配置 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要显示的&nbsp;html&nbsp;错误页 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以代替错误堆栈跟踪。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;customErrors&nbsp;mode="RemoteOnly"&nbsp;defaultRedirect="GenericErrorPage.htm"&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;error&nbsp;statusCode="403"&nbsp;redirect="NoAccess.htm"&nbsp;/&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;error&nbsp;statusCode="404"&nbsp;redirect="FileNotFound.htm"&nbsp;/&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/customErrors&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/system.web&gt; <BR>&lt;/configuration&gt; <BR><BR>vs2005里进行测试成功,但放到IIS里失败 <BR><BR>检查了几次,没发现问题,仔细想了想 <BR><BR>先了下,iis的工作流程应该是遇到.aspx扩展名,交给.net处理,然后才能调用httpModules进行url映射 <BR>http://onewww.net/llinzzi <BR>没有aspx扩展名,所以iis直接当成文件架,返回404错误了 <BR>而vs2005里的调试web服务器把所有的请求都发给了.net处理,所以成功. <BR>于是更改映为 <BR>&nbsp;&nbsp;&lt;Rule&nbsp;key="/(.*)/index.aspx"&nbsp;value="/a.aspx?name=$1"&nbsp;/&gt; <BR>浏览 <BR>http://onewww.net/llinzzi/index.aspx <BR>测试成功. <BR>开心,把index.aspx设置成默认文档 <BR>测试http://onewww.net/llinzzi/&nbsp;结果还是404错误 <BR>想了下iis认为llinzzi文件夹不存在,自然就没用默认文档去访问 <BR><BR>郁闷,想了很多方法,均失败 <BR>难道要用&nbsp;llinzzi/index.html访问?难道要生成真是存在的文件夹? <BR>都不是理想的方案 <BR><BR>在尝试从iis里的主目录里的配置里修改isapi来实现用文件夹对iis的解析的时候,突然发现windows2003服务器上的iis6对比我工作机xp上的iis5多了一个名为 <BR>通配符应用程序映射&nbsp;的设置,眼睛一亮..有戏,第一名字听起来有门,第二2003本来就是为.net打造的.于是点插入, <BR>输入&nbsp;c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll&nbsp; <BR>测试,成功! <BR><BR>搜索了下关于&nbsp;通配符应用程序映射&nbsp;的资料 <BR><BR>安装通配符应用程序映射 <BR>在&nbsp;IIS&nbsp;6.0&nbsp;中,管理员可以在每次开始对网站或虚拟目录发送请求时,将该网站或虚拟目录配置为运行&nbsp;Internet&nbsp;服务器&nbsp;API&nbsp;(ISAPI),而不管所请求文件的扩展名。 <BR><BR>当&nbsp;IIS&nbsp;Web&nbsp;服务器接受到来自客户端的请求时,Web&nbsp;服务器会查看在请求中命名的文件扩展名,以确定有哪一个&nbsp;ISAPI&nbsp;或公共网关接口&nbsp;(CGI)&nbsp;应用程序来处理该文件。例如,如果请求名为&nbsp;Default.<A href="http://www.l-blog.com.cn/index.php?do=class&amp;id=3" target=_blank><SPAN style="COLOR: #335588">asp</SPAN></A>&nbsp;的网页时,IIS&nbsp;可以从应用程序映射列表中知道&nbsp;Default.<A href="http://www.l-blog.com.cn/index.php?do=class&amp;id=3" target=_blank><SPAN style="COLOR: #335588">asp</SPAN></A>&nbsp;由&nbsp;Asp.dll&nbsp;ISAPI&nbsp;应用程序处理。 <BR><BR>如果想在所请求的页面发送到映射的应用程序前对每次客户端请求执行特定的任务,可以编写一个&nbsp;ISAPI&nbsp;筛选器在请求到达时将其截获。但是,ISAPI&nbsp;筛选器具有以下限制: <BR><BR>它们不能访问请求主体,而只访问头。&nbsp; <BR>它们只能在每个站点配置,而不能在每个虚拟目录配置。&nbsp; <BR>它们不应包含长期运行的操作,因为&nbsp;ISAPI&nbsp;筛选器是同步进行的。&nbsp; <BR>它们的灵活性较小,因为&nbsp;ISAPI&nbsp;筛选器&nbsp;API&nbsp;的功能比&nbsp;ISAPI&nbsp;扩展&nbsp;API&nbsp;少,后者用于编写&nbsp;ISAPI&nbsp;应用程序。&nbsp; <BR>它们在时间上难以管理。&nbsp; <BR>它们是事件驱动的。&nbsp; <BR><BR><BR><BR>通过使用通配符应用程序映射,您可以在所请求的页面发送到其映射应用程序之前截获每个请求。其效果就像拥有处理每个文件名扩展的应用程序映射。这就是使用“通配符”来命名这一功能的原因。使用通配符应用程序映射的应用程序只能是&nbsp;ISAPI&nbsp;应用程序。 <BR><BR>客户端请求采用以下路由: <BR><BR>传入的请求由安装在根网站上的任何现有的&nbsp;ISAPI&nbsp;筛选器处理。ISAPI&nbsp;筛选器依次执行。&nbsp; <BR>请求被发送到任何现有的通配符应用程序映射的应用程序,这些程序也是依次执行的。如果传入的请求是对虚拟目录中的&nbsp;Web&nbsp;文件进行请求的,且通配符应用程序映射已安装在了该虚拟目录和根网站上,那么只有安装在该虚拟目录的通配符应用程序映射才被执行。如果该虚拟目录上没有安装通配符应用程序映射,则将执行安装在网站上的通配符应用程序映射。换句话说,通配符应用程序映射只在所请求的&nbsp;Web&nbsp;文件所处的应用程序中不存在映射时才会被继承。&nbsp; <BR>IIS&nbsp;服务器会查看应用程序映射表,以确定由哪个&nbsp;ISAPI&nbsp;应用程序或&nbsp;CGI&nbsp;脚本专门处理所请求的文件。&nbsp; <BR>每个阶段都可以附加响应,然后传回给客户端。&nbsp; <BR>使用通配符应用程序映射 <BR>通配符应用程序映射可以在以下方案中使用: <BR><BR>高安全性&nbsp;Web&nbsp;应用程序(如银行业应用程序)要求对每个提出请求的用户根据用户名、密码和帐户号数据库进行身份验证。例如,一旦用户通过了身份验证,将会创建规定用户可以访问哪些信息的特定规则。如果通配符应用程序映射确定用户不具有相应权利,它可以阻止请求的进一步访问,或将请求发送到所请求的网页以外的网页。这种自定义的身份验证和授权方案可以在&nbsp;ISAPI&nbsp;应用程序中执行,并安装为通配符应用程序映射。这样,所有用户必须通过身份验证,不考虑他们所请求的文件的扩展名。&nbsp; <BR>针对单个用户的广告电子商务网站。例如,当返回用户所提出的请求时,通配符应用程序映射应用程序将检查他们的身份,然后查询他们以前已观看或购买的项目。一旦通配符脚本映射将控制传送到被请求的页面,就可以显示适合该用户的广告。&nbsp; <BR>要点&nbsp;您必须是本地计算机上&nbsp;Administrators&nbsp;组的成员或者必须被委派了相应的权限,才能执行下列步骤。作为安全性的最佳操作,请使用不属于&nbsp;Administrators&nbsp;组的帐户登录计算机,然后使用运行方式命令以管理员身份运行&nbsp;IIS&nbsp;管理器。在命令提示符下,键入&nbsp;runas&nbsp;/user:administrative_accountname&nbsp;"mmc&nbsp;%systemroot%\system32\inetsrv\iis.msc"。 <BR><BR>将通配符应用程序映射添加到&nbsp;Web&nbsp;服务器或网站 <BR><BR>在&nbsp;IIS&nbsp;管理器中,展开本地计算机,展开“网站”文件夹,右键单击所需的网站或虚拟目录,然后单击“属性”。&nbsp; <BR>单击相应的选项卡:“主目录”、“虚拟目录”、或“目录”。&nbsp; <BR>在“应用程序设置”区域中,单击“配置”,然后单击“映射”选项卡。&nbsp; <BR>要安装通配符应用程序映射,请进行以下操作:&nbsp; <BR>在“映射”选项卡上,单击“插入”。&nbsp; <BR>在“可执行文件”文本框中键入&nbsp;DLL&nbsp;的路径或单击“浏览”以找到该文件,如果该&nbsp;DLL&nbsp;文件是脚本引擎,选择“应用程序引擎”复选框,然后单击“确定”。&nbsp; <BR>要编辑或删除通配符应用程序映射,请进行以下操作:&nbsp; <BR>在“应用程序扩展”列表中,单击想更改的脚本映射。&nbsp; <BR>单击“编辑”更改脚本映射,或单击“删除”删除脚本映射。&nbsp; <BR>要更改通配符应用程序执行的顺序,在“通配符应用程序映射(执行顺序)”框中重新安排通配符应用程序映射,其方法是单击“上移”或“下移”按钮直到符合您想要的顺序为止。&nbsp; <A title=北京电磁炉 href="http://shop.newship.biz" target=_self>北京电磁炉</A><BR>注意&nbsp;请不要在通配符应用程序映射列表中多次列出同一应用程序。
页: [1]
查看完整版本: ASP.NET 2.0 中的UrlRewrite