ASP.NET使用URLRewriter重写二级域名
这里要求对域名进行重写,实现
http://1234.abc.com/到~/Defa.aspx?id=1234的重写。
第一:域名
首先域名要支持泛解悉,就是域名解悉的主机名为星号*,例:*.abc.com。如下图
这样能保证你在浏览器地址栏输入任何前缀,DNS都会把它们指向到你指定的IP地址上。
第二:IIS设置(Win2003+IIS6为例)
(1)网站必须为Web服务器的默认站点,即端口号为80,主机头为空的站点。如下图所示。
该站点接收所有对该服务器的HTTP请求(其它设置为主机头的站点除外)。所以任何二级域名访问该服务器都会由该站点进行处理。
(2)另外要在站点的“通配符应用程序映射”列表中添加ASP.NET的Web请求处理程序aspnet_isapi.dll。如下图所示。
在这里的设置,是让该站点接到的所有请求都交给aspnet_isapi.dll处理。
第三:修改Microsoft的URLRewriter。
运行开源项目URLRewriter。这里需要修改两个地方:
(1)BaseModuleRewriter.cs类
viewsourceprint?
01 | protected virtual void BaseModuleRewriter_AuthorizeRequest( object sender,EventArgse) |
05 | HttpApplicationapp=(HttpApplication)sender; |
07 | //Rewrite(app.Request.Path,app); |
09 | Rewrite(app.Request.Url.AbsoluteUri,app); //######这里修改了 |
这里将app.Request.Path替换成了app.Request.Url.AbsoluteUri
(2)ModuleRewriter.cs类
viewsourceprint?
01 | protected override void Rewrite( string requestedPath,System.Web.HttpApplicationapp) |
05 | //loginformationtotheTraceobject. |
07 | app.Context.Trace.Write( "ModuleRewriter" , "EnteringModuleRewriter" ); |
11 | //gettheconfigurationrules |
13 | RewriterRuleCollectionrules=RewriterConfiguration.GetConfig().Rules; |
17 | //iteratethrougheachrule... |
19 | for ( int i=0;i<rules.Count;i++) |
23 | //getthepatterntolookfor,andResolvetheUrl(convert~intotheappropriatedirectory) |
25 | //stringlookFor="^"+RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath,rules[i].LookFor)+"$"; |
27 | string lookFor= "^" +rules[i].LookFor+ "$" ; //######这里修改了 |
31 | //Createaregex(notethatIgnoreCaseisset...) |
33 | Regexre= new Regex(lookFor,RegexOptions.IgnoreCase); |
39 | if (re.IsMatch(requestedPath)) |
43 | //matchfound-doanyreplacementneeded |
45 | string sendToUrl=RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath,re.Replace(requestedPath,rules[i].SendTo)); |
49 | //logrewritinginformationtotheTraceobject |
51 | app.Context.Trace.Write( "ModuleRewriter" , "RewritingURLto" +sendToUrl); |
57 | RewriterUtils.RewriteUrl(app.Context,sendToUrl); |
67 | //LoginformationtotheTraceobject |
69 | app.Context.Trace.Write( "ModuleRewriter" , "ExitingModuleRewriter" ); |
这里将stringlookFor="^"+RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath,rules[i].LookFor)+"$";
改成了stringlookFor="^"+rules[i].LookFor+"$";
这两个地方修改完以后,生成项目。将项止目bin/Debug目录下的URLRewriter.dll文件Copy到我们要重写URL的项目中。
第四:配置项目
(1)在web.config文件的configSections节点下添加如下一行代码
<sectionname="RewriterConfig"type="URLRewriter.Config.RewriterConfigSerializerSectionHandler,URLRewriter"/>
这里配置一个重写配置的类
(2)修改httpModules节点,在里面添加一行配置代码
<addtype="URLRewriter.ModuleRewriter,URLRewriter"name="ModuleRewriter"/>
(3)在主节点configuration节点下添加路由规则,代码如下:
<!--URL重写将捕获页面转发到实际地址-->
<RewriterConfig>
<Rules>
<RewriterRule>
<LookFor>http://(\w+).abc.com/</LookFor>
<SendTo>~/Defa.aspx?id=$1</SendTo>
</RewriterRule>
</Rules>
</RewriterConfig>
<!--URL重写将捕获页面转发到实际地址(结束)-->
代码里一个RewriterRule节点就是一个规则,这时只有一个,即把域名中的主机头部分做为Defa.aspx页面的id参数的值发送给Defa.aspx页面。
注意:这里LookFor节点里的http://(\w+).abc.com/不能少了最后的反斜框
OK,一切完工
发布,上传到服务器,测试一下,如图
原文链接:/article/5185561.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理