之前我就想做二级域名指向同一个IP同一个程序无非是在路由匹配规则上做文章也就是对Url的重写的一种思路。我用了半天时间上网查阅了相关资料并做了Demo测试是完全

以的,在这分享给大家...

假如网站主域名是:www.abc.com

实现二级域名是:     tianjin.abc.com , shanxi.abc.com 这个样子。

首先定义DomainData、DomainRoute类

  1. public class DomainRoute : Route
  2. {
  3. private Regex domainRegex;
  4. private Regex pathRegex;
  5.  
  6. public string Domain { get; set; }
  7.  
  8. public DomainRoute(string domain, string url, RouteValueDictionary defaults)
  9. : base(url, defaults, new MvcRouteHandler())
  10. {
  11. Domain = domain;
  12. }
  13.  
  14. public DomainRoute(string domain, string url, RouteValueDictionary defaults, IRouteHandler routeHandler)
  15. : base(url, defaults, routeHandler)
  16. {
  17. Domain = domain;
  18. }
  19.  
  20. public DomainRoute(string domain, string url, object defaults)
  21. : base(url, new RouteValueDictionary(defaults), new MvcRouteHandler())
  22. {
  23. Domain = domain;
  24. }
  25.  
  26. public DomainRoute(string domain, string url, object defaults, IRouteHandler routeHandler)
  27. : base(url, new RouteValueDictionary(defaults), routeHandler)
  28. {
  29. Domain = domain;
  30. }
  31.  
  32. public override RouteData GetRouteData(HttpContextBase httpContext)
  33. {
  34. // 构造 regex
  35. domainRegex = CreateRegex(Domain);
  36. pathRegex = CreateRegex(Url);
  37.  
  38. // 请求信息
  39. string requestDomain = httpContext.Request.Headers["host"];
  40. if (!string.IsNullOrEmpty(requestDomain))
  41. {
  42. if (requestDomain.IndexOf(":") > 0)
  43. {
  44. requestDomain = requestDomain.Substring(0, requestDomain.IndexOf(":"));
  45. }
  46. }
  47. else
  48. {
  49. requestDomain = httpContext.Request.Url.Host;
  50. }
  51. string requestPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + httpContext.Request.PathInfo;
  52.  
  53. // 匹配域名和路由
  54. Match domainMatch = domainRegex.Match(requestDomain);
  55. Match pathMatch = pathRegex.Match(requestPath);
  56.  
  57. // 路由数据
  58. RouteData data = null;
  59. if (domainMatch.Success && pathMatch.Success)
  60. {
  61. data = new RouteData(this, RouteHandler);
  62.  
  63. // 添加默认选项
  64. if (Defaults != null)
  65. {
  66. foreach (KeyValuePair<string, object> item in Defaults)
  67. {
  68. data.Values[item.Key] = item.Value;
  69. }
  70. }
  71.  
  72. // 匹配域名路由
  73. for (int i = 1; i < domainMatch.Groups.Count; i++)
  74. {
  75. Group group = domainMatch.Groups[i];
  76. if (group.Success)
  77. {
  78. string key = domainRegex.GroupNameFromNumber(i);
  79.  
  80. if (!string.IsNullOrEmpty(key) && !char.IsNumber(key, 0))
  81. {
  82. if (!string.IsNullOrEmpty(group.Value))
  83. {
  84. data.Values[key] = group.Value;
  85. }
  86. }
  87. }
  88. }
  89.  
  90. // 匹配域名路径
  91. for (int i = 1; i < pathMatch.Groups.Count; i++)
  92. {
  93. Group group = pathMatch.Groups[i];
  94. if (group.Success)
  95. {
  96. string key = pathRegex.GroupNameFromNumber(i);
  97.  
  98. if (!string.IsNullOrEmpty(key) && !char.IsNumber(key, 0))
  99. {
  100. if (!string.IsNullOrEmpty(group.Value))
  101. {
  102. data.Values[key] = group.Value;
  103. }
  104. }
  105. }
  106. }
  107. }
  108.  
  109. return data;
  110. }
  111.  
  112. public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
  113. {
  114. return base.GetVirtualPath(requestContext, RemoveDomainTokens(values));
  115. }
  116.  
  117. public DomainData GetDomainData(RequestContext requestContext, RouteValueDictionary values)
  118. {
  119. // 获得主机名
  120. string hostname = Domain;
  121. foreach (KeyValuePair<string, object> pair in values)
  122. {
  123. hostname = hostname.Replace("{" + pair.Key + "}", pair.Value.ToString());
  124. }
  125.  
  126. // Return 域名数据
  127. return new DomainData
  128. {
  129. Protocol = "http",
  130. HostName = hostname,
  131. Fragment = ""
  132. };
  133. }
  134.  
  135. private Regex CreateRegex(string source)
  136. {
  137. // 替换
  138. source = source.Replace("/", @"\/?");
  139. source = source.Replace(".", @"\.?");
  140. source = source.Replace("-", @"\-?");
  141. source = source.Replace("{", @"(?<");
  142. source = source.Replace("}", @">([a-zA-Z0-9_]*))");
  143.  
  144. return new Regex("^" + source + "$");
  145. }
  146.  
  147. private RouteValueDictionary RemoveDomainTokens(RouteValueDictionary values)
  148. {
  149. Regex tokenRegex = new Regex(@"({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?");
  150. Match tokenMatch = tokenRegex.Match(Domain);
  151. for (int i = 0; i < tokenMatch.Groups.Count; i++)
  152. {
  153. Group group = tokenMatch.Groups[i];
  154. if (group.Success)
  155. {
  156. string key = group.Value.Replace("{", "").Replace("}", "");
  157. if (values.ContainsKey(key))
  158. values.Remove(key);
  159. }
  160. }
  161.  
  162. return values;
  163. }
  164. }
  165.     public class DomainData
  166.     {
  167.         public string Protocol { get; set; }
  168.         public string HostName { get; set; }
  169.         public string Fragment { get; set; }
  170.     }

如果项目是MVC4.0那么就打开App_Start 文件夹下面的RouteConfig.cs路由配置文件,如果是MVC3.0项目则添加路由,Global.asax 文件默认的MVC 路由的代码

  1. public static void RegisterRoutes(RouteCollection routes)
  2. {
  3. routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
  4.  
  5. routes.MapRoute(
  6. "Default",
  7. "{controller}/{action}/{id}",
  8. new { controller = "Home", action = "Index", id = UrlParameter.Optional }
  9. );
  10.  
  11. }

修改后的路由如下:

  1. public static void RegisterRoutes(RouteCollection routes)
  2. {
  3. routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
  4. routes.Add(
  5. "@DomainRoute", new DomainRoute(
  6. "abc.com",
  7. "{controller}/{action}/{id}",
  8. new { controller = "Home", action = "Index", id = UrlParameter.Optional }
  9. ));
  10. routes.Add(
  11. "wwwDomainRoute", new DomainRoute(
  12. "www.abc.com",
  13. "{controller}/{action}/{id}",
  14. new { controller = "Home", action = "Index", id = UrlParameter.Optional }
  15. ));
  16. routes.Add(
  17. "DomainRoute", new DomainRoute(
  18. "{CityNameUrl}.abc.com",
  19. "{controller}/{action}/{id}",
  20. new { CityNameUrl = "", controller = "Home", action = "City", id = "" }
  21. ));
  22. routes.MapRoute(
  23. name: "Default",
  24. url: "{controller}/{action}/{id}",
  25. defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
  26. );
  27.  
  28. }

当然这个路由解析匹配顺序是按照你们的需求去修改,但是路由匹配规则是从上到下的找符合的一条进行匹配,如果匹配到则不继续往下走,还需要说明一点, 我的域名是在万网注册的。所以还需要在域名解析那一块添加一条泛解析规则:

然后再程序中获取tianjin.abc.com 获取前缀名称tianjin这个动态参数的方法是:

var cityName = RouteData.Values["CityNameUrl"]; 就可以得到,

以上为个人学习总结,如有错误,欢迎指正!!共同学习研究!!!

参考地址:http://www.cnblogs.com/wenthink/archive/2013/04/10/MvcDynamicSecondaryDomain.html

http://blog.maartenballiauw.be/post/2009/05/20/ASPNET-MVC-Domain-Routing.aspx

转自:http://www.liguoqing.net/static/2014/12/15/50.html,感谢

ASP.NET MVC3.0或4.0设置二级域名的方法的更多相关文章

  1. 织梦dedecms移动版设置二级域名的方法 织梦如何设置m.开头的域名

    dedecms/' target='_blank'>织梦dedecms建站系统自从2015.06.18号升级后,系统增加了最强的手机站功能,模板与PC模板分开,标签90%类似,数据同步,很牛很强 ...

  2. 借助微软提供的url重写类库URLRewriter.dll(1.0)实现程序自动二级域名,域名需要泛解析

    二级域名和系统中会员帐号自动关联,也就是系统中注册一个会员,会员自动就可以通过二级域名来访问,比如我的帐号是zhangsan,我在morecoder.com注册后,访问zhangsan.morecod ...

  3. asp.net MVC把Areas区域绑定成二级域名

    先分析需求 在MVC项目中,我们如果有两个Areas.比如Test和DEMO.我们的访问地址应该是 http://localhost:8098/test http://localhost:8098/d ...

  4. 设置二级域名共享一级域名Cookie和删除共享Cookie

     设置共享Cookie: 二级域名要想共享一级域名的cookie,只需要设置cookie.Domain = ".一级域名.com";   删除共享Cookie:  HttpCook ...

  5. django 项目部署在 Apache 后, 设置二级域名(Apache虚拟主机 、 万网二级域名设置)

    上一篇文章简单说了怎么把django的项目部署到Apache上. 现在想弄个二级域名,也就是我原来有个域名 www.mysite.com,现在我想弄个 bbs.mysite.com ,该怎么做呢. 要 ...

  6. ASP.net获取当前页面的文件名,参数,域名等方法

    ASP.net后台获取当前页面的文件名 System.IO.Path.GetFileName(Request.Path).ToString(); 获取当前页面文件名,参数,域名等方法 假设当前页完整地 ...

  7. Apache设置二级域名和虚拟主机

    apache  httpd.conf 最后: ------------------------------NameVirtualHost *:80<VirtualHost *:80>    ...

  8. 在ExpressJS中设置二级域名跨域共享Cookie

    问题:我使用expressjs和mongostore来管理session.下面是expressjs中的设置. app.configure(function(){ app.use(express.ses ...

  9. apache虚拟主机设置泛域名的方法

    在apache虚拟主机中设置泛域名解析,主要是用到ServerAlias 的配置. 1.支持多域名 例如,让mail.jbxue.org.smtp.jbxue.org.pop3.jbxue.org 都 ...

随机推荐

  1. 搭建ngrok服务器(ubuntu 14)-- 微信 80端口和IPC备案限制解决方案

    概述: ngrok其实这东西,我也不是很懂,所以也直接跟大家说,这就是个类似花生壳的东西. 简单来说,它就好像把我们内网自己使用的电脑和服务器用vpn连接起来,然后你的电脑就可以从互联网来访问了,有个 ...

  2. web项目环境搭建(3):搭建Spring+MyBatis

    spring 4.1.7 + MyBatis 3.3 正式开始配置关键内容,这是硬货 一. 新建spring配置文件,起名为 applicationContext.xml,放在src/main/res ...

  3. (原)C++中指针不初始化就传递的问题

    C++中指针的使用.以前在使用指针之前都会初始化.今天没有初始化,然后指针传递后没有内容(testptrnoret),后来发现返回指针的话(testptrret),就可以了. // testptr.c ...

  4. JAVA classpath, 纠正我一直以来错误的认知

    如何调在CLI中使用java tool(JDK中的java命令)调用一个打包在jar中的类,我想大多数人都能给出笼统的方案: java -classpath xxxxx com.test.classA ...

  5. cocos2d-x 工程目录结构说明

    下载最新的cocos2d-x,解压完之后呈现出如下的目录结构: cocos2dx:框架核心目录,里面是存放了2dx引擎的核心代码. CocosDenshion:各个平台的音效实现. document: ...

  6. Python学习之--异常处理

    Python中的Exceptions是所有异常的基类,内置的异常类都放在了exceptions模块中,通过dir()函数可以看到这些内置的类 通过raise 语句触发异常,如 >>> ...

  7. MyEclipse 点击 部署 按钮 无效的解决办法

    问题描述 1 通常情况下,当我们点击MyEclipse任务栏上的部署按钮时,会弹出项目部署框,如下图:   2 但我们有时也会遇到点击部署按钮怎么也弹不出项目部署框的问题. END 解决方法一: 1 ...

  8. RMAN-06023: no backup or copy of datafile 6 found to restore

    一:问题描述 我用指定备份集恢复时,报错: RMAN> run { 2> shutdown immediate; 3> startup mount; 4> allocate c ...

  9. C++ wstring string char* wchar_t相互转换

    标签: stringwstringwchar_tcharc++2013-12-19 00:29 3721人阅读 评论(0) 收藏 举报本文章已收录于: C++知识库 分类: C/C++(50) 1. ...

  10. myEclipse异常解决:Errors occurred during the build. Errors running builder Mule 3 hot deployment

    选择一个项目—-右键Properties—-Builders—-取消 “JavaScript Validator”  和 Mule 3 hot deployment 的勾就OK了 根据具体异常,勾选. ...