这里要求对域名进行重写,实现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类
| 01 | protectedvirtualvoidBaseModuleRewriter_AuthorizeRequest(objectsender, EventArgs e) | 
| 05 |      HttpApplication app = (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类
| 01 | protectedoverridevoidRewrite(stringrequestedPath, System.Web.HttpApplication app) | 
| 05 |     // log information to the Trace object. | 
| 07 |     app.Context.Trace.Write("ModuleRewriter", "Entering ModuleRewriter"); | 
| 11 |     // get the configuration rules | 
| 13 |     RewriterRuleCollection rules = RewriterConfiguration.GetConfig().Rules; | 
| 17 |     // iterate through each rule... | 
| 19 |     for(inti = 0; i < rules.Count; i++) | 
| 23 |         // get the pattern to look for, and Resolve the Url (convert ~ into the appropriate directory) | 
| 25 |         //string lookFor = "^" + RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, rules[i].LookFor) + "$"; | 
| 27 |         stringlookFor = "^"+ rules[i].LookFor + "$";    // ## ## ## 这里修改了 | 
| 31 |         // Create a regex (note that IgnoreCase is set...) | 
| 33 |         Regex re = newRegex(lookFor, RegexOptions.IgnoreCase); | 
| 37 |         // See if a match is found | 
| 39 |         if(re.IsMatch(requestedPath)) | 
| 43 |             // match found - do any replacement needed | 
| 45 |             stringsendToUrl = RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, re.Replace(requestedPath, rules[i].SendTo)); | 
| 49 |             // log rewriting information to the Trace object | 
| 51 |             app.Context.Trace.Write("ModuleRewriter", "Rewriting URL to "+ sendToUrl); | 
| 57 |             RewriterUtils.RewriteUrl(app.Context, sendToUrl); | 
| 59 |             break;     // exit the for loop | 
| 67 |     // Log information to the Trace object | 
| 69 |     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,一切完工
发布,上传到服务器,测试一下,如图
