一起谈.NET技术,ASP.NET下用URLRewriter重写二级域名

简介:   这里要求对域名进行重写,实现http://1234.abc.com/ 到 ~/Defa.aspx?id=1234的重写。  第一:域名  首先域名要支持泛解悉,就是域名解悉的主机名为星号*,例:*.abc.com。

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

相关实践学习
基于函数计算快速搭建Hexo博客系统
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
|
6月前
|
存储 开发框架 前端开发
asp.net与asp.net优缺点及示例
asp.net与asp.net优缺点及示例
|
1月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
29 0
|
1月前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
62 0
|
1月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
95 5
|
3月前
|
开发框架 安全 搜索推荐
分享105个NET源码ASP源码,总有一款适合您
分享105个NET源码ASP源码,总有一款适合您
27 4
|
7月前
|
开发框架 前端开发 .NET
.NET 8 Release Candidate 1 (RC1)现已发布,包括许多针对ASP.NET Core的重要改进!
.NET 8 Release Candidate 1 (RC1)现已发布,包括许多针对ASP.NET Core的重要改进!
175 0
.NET 8 Release Candidate 1 (RC1)现已发布,包括许多针对ASP.NET Core的重要改进!
|
8月前
|
存储 开发框架 .NET
ASP.NET学生管理系统(.NET毕业设计)
ASP.NET学生管理系统(.NET毕业设计)
100 0
|
9月前
|
开发框架 前端开发 JavaScript
ASP .Net Core 中间件的使用(一):搭建静态文件服务器/访问指定文件
ASP .Net Core 中间件的使用(一):搭建静态文件服务器/访问指定文件
|
10月前
|
开发框架 供应链 前端开发
net基于asp.net的社区团购网站
社区团购系统依托社区团购系统和社区门店,是现在的一个重大市场和发展方向,通过研究企业在社区团购系统环境下的营销模式创新,对于普通的零售业和传统社区团购系统的转型发展具有重要的理论意义。随着互联网行业的发展,人们的生活方式发生着重大变化,人们越来越倾向于网络购物,这对传统企业来说如何把客户留下是一个重大挑战。就现在而言,由于社区团购的竞争已经进入最紧张激烈的阶段,有些团购平台甚至已经彼此之间打起了价格战,其中不乏有平台因为利润变少或资金链断裂而半途败亡。企业在实际的商业活动中,往往会面临许多等待优化的问题。因此,要在竞争激烈的市场中拔得头筹,必须重视提升对新商业模式的全面认知,科学于实际贴合的分
|
12月前
|
缓存 前端开发 JavaScript
采用.Net Core技术框架开发的医院云LIS平台源码,B/S架构
基于B/S架构的医学实验室检验系统源码,整个系统的运行基于WEB层面,只需要在对应的工作台安装一个浏览器软件有外网即可访问。全套系统采用云部署模式,部署一套可支持多家医院检验科共同使用。 采用.Net Core新的技术框架、DEV报表、前端js封装、分布式文件存储、分布式缓存等,支持LIS独立部署,Docker部署等多种方式。