您的位置:知识库 » .NET技术

ASP.NET下用URLRewriter重写二级域名

作者: 张浩华  来源: 博客园  发布时间: 2011-03-22 14:17  阅读: 4833 次  推荐: 0   原文链接   [收藏]  
摘要:今天我们将谈到的是ASP.NET下用URLRewriter重写二级域名的问题,还涉及到相关扩展库的事项,希望对大家有所帮助。

  这里要求对域名进行重写,实现http://1234.abc.com/ 到 ~/Defa.aspx?id=1234的重写。

  第一:域名

  首先域名要支持泛解悉,就是域名解悉的主机名为星号*,例:*.abc.com。如下图


  这样能保证你在浏览器地址栏输入任何前缀,DNS都会把它们指向到你指定的IP地址上。

  第二:IIS设置(Win2003 + IIS 6为例)

  (1)网站必须为Web服务器的默认站点,即端口号为80,主机头为空的站点。如下图所示。


  该站点接收所有对该服务器的HTTP请求(其它设置为主机头的站点除外)。所以任何二级域名访问该服务器都会由该站点进行处理。

  (2)另外要在站点的“通配符应用程序映射”列表中添加ASP.NET的Web请求处理程序aspnet_isapi.dll。如下图所示。


  在这里的设置,是让该站点接到的所有请求都交给aspnet_isapi.dll处理。

  第三:修改Microsoft的URLRewriter。

  运行开源项目URLRewriter。这里需要修改两个地方:

  (1)BaseModuleRewriter.cs类

protected virtual void BaseModuleRewriter_AuthorizeRequest(object sender, EventArgs e)
{
HttpApplication app
= (HttpApplication) sender;
//Rewrite(app.Request.Path, app);
Rewrite(app.Request.Url.AbsoluteUri, app); // ## ## ## 这里修改了
}

  这里将app.Request.Path 替换成了 app.Request.Url.AbsoluteUri

  (2)ModuleRewriter.cs类

1. protected override void Rewrite(string requestedPath, System.Web.HttpApplication app)
2. {
3. // log information to the Trace object.
4. app.Context.Trace.Write("ModuleRewriter", "Entering ModuleRewriter");
5. // get the configuration rules
6. RewriterRuleCollection rules = RewriterConfiguration.GetConfig().Rules;
7. // iterate through each rule...
8. for (int i = 0; i < rules.Count; i++)
9. {
10. // get the pattern to look for, and Resolve the Url (convert ~ into the appropriate directory)
11. //string lookFor = "^" + RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, rules[i].LookFor) + "$";
12. string lookFor = "^" + rules[i].LookFor + "$"; // ## ## ## 这里修改了
13. // Create a regex (note that IgnoreCase is set...)
14. Regex re = new Regex(lookFor, RegexOptions.IgnoreCase);
15. // See if a match is found
16. if (re.IsMatch(requestedPath))
17. {
18. // match found - do any replacement needed
19. string sendToUrl = RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, re.Replace(requestedPath, rules[i].SendTo));
20. // log rewriting information to the Trace object
21. app.Context.Trace.Write("ModuleRewriter", "Rewriting URL to " + sendToUrl);
22. // Rewrite the URL
23. RewriterUtils.RewriteUrl(app.Context, sendToUrl);
24. break; // exit the for loop
25. }
26. }
27. // Log information to the Trace object
28. app.Context.Trace.Write("ModuleRewriter", "Exiting ModuleRewriter");
29. }

  这里将string lookFor = "^" + RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, rules[i].LookFor) + "$";

  改成了 string lookFor = "^" + rules[i].LookFor + "$";

  这两个地方修改完以后,生成项目。将项止目bin/Debug目录下的URLRewriter.dll文件Copy到我们要重写URL的项目中。

  第四:配置项目

  (1)在web.config文件的configSections节点下添加如下一行代码

1. <section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter"/>

  这里配置一个重写配置的类

  (2)修改httpModules节点,在里面添加一行配置代码

1. <add type="URLRewriter.ModuleRewriter, URLRewriter" name="ModuleRewriter" />

  (3)在主节点configuration节点下添加路由规则,代码如下:

1. <!-- URL重写 将捕获页面转发到实际地址 -->
2. <RewriterConfig>
3. <Rules>
4. <RewriterRule>
5. <LookFor>http://(\w+).abc.com/</LookFor>
6. <SendTo>~/Defa.aspx?id=$1</SendTo>
7. </RewriterRule>
8. </Rules>
9. </RewriterConfig>
10. <!-- URL重写 将捕获页面转发到实际地址 ( 结束 ) -->

  代码里一个RewriterRule节点就是一个规则,这时只有一个,即把域名中的主机头部分做为Defa.aspx页面的id参数的值发送给Defa.aspx页面。

  注意:这里LookFor节点里的http://(\w+).abc.com/不能少了最后的反斜框

  OK,一切完工

  发布,上传到服务器,测试一下,如图

  本次测试需要一个类库:URLRewriter.dll (测试版本 1.0.1495.18710)

0
1

.NET技术热门文章

    .NET技术最新文章

      最新新闻

        热门新闻