首页 | 新闻 | 交流 | 问吧 | 文档 | 手册 | 下载 | 博客

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

作者:  时间: 2011-03-18

这里要求对域名进行重写,实现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类

protected override void Rewrite(string requestedPath, System.Web.HttpApplication app)

{

    // log information to the Trace object.

    app.Context.Trace.Write("ModuleRewriter", "Entering ModuleRewriter");

 

    // get the configuration rules

    RewriterRuleCollection rules = RewriterConfiguration.GetConfig().Rules;

 

    // iterate through each rule...

    for (int i = 0; i < rules.Count; i++)

    {

        // get the pattern to look for, and Resolve the Url (convert ~ into the appropriate directory)

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

        string lookFor = "^" + rules[i].LookFor + "$";    // ## ## ## 这里修改了

 

        // Create a regex (note that IgnoreCase is set...)

        Regex re = new Regex(lookFor, RegexOptions.IgnoreCase);

 

        // See if a match is found

        if (re.IsMatch(requestedPath))

        {

            // match found - do any replacement needed

            string sendToUrl = RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, re.Replace(requestedPath, rules[i].SendTo));

 

            // log rewriting information to the Trace object

            app.Context.Trace.Write("ModuleRewriter", "Rewriting URL to " + sendToUrl);

 

            // Rewrite the URL

            RewriterUtils.RewriteUrl(app.Context, sendToUrl);

            break;     // exit the for loop

        }

    }

 

    // Log information to the Trace object

    app.Context.Trace.Write("ModuleRewriter", "Exiting ModuleRewriter");

}

这里将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
3 <RewriterConfig>
4
5 <Rules>
6
7 <RewriterRule>
8
9 <LookFor>http://(\w+).abc.com/</LookFor>
10
11 <SendTo>~/Defa.aspx?id=$1</SendTo>
12
13 </RewriterRule>
14
15 </Rules>
16
17 </RewriterConfig>
18
19 <!-- URL重写 将捕获页面转发到实际地址 ( 结束 ) -->

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

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

OK,一切完工

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

作者: 张浩华 发表于 2011-03-18 13:11 原文链接

评论: 0 查看评论 发表评论


最新新闻:
· 腾讯出击移动互联搜索 高管称今年做到市场第二(2011-03-18 13:09)
· 日本网游业集体停服 中国公司坚守不撤(2011-03-18 13:07)
· Maemo不死?诺基亚五月推“伪MeeGo”设备(2011-03-18 13:05)
· 环球企业家:马云的智力游戏(2011-03-18 13:01)
· 美团回应央视曝光:已是成年往事 将合理赔偿(2011-03-18 12:35)

编辑推荐:由扩展方法引申出的编程思维

网站导航:博客园首页  我的园子  新闻  闪存  小组  博问  知识库