ASP.NET MVC3.0或4.0设置二级域名的方法
之前我就想做二级域名指向同一个IP同一个程序无非是在路由匹配规则上做文章也就是对Url的重写的一种思路。我用了半天时间上网查阅了相关资料并做了Demo测试是完全
以的,在这分享给大家...
假如网站主域名是:www.abc.com
实现二级域名是: tianjin.abc.com , shanxi.abc.com 这个样子。
首先定义DomainData、DomainRoute类
- public class DomainRoute : Route
- {
- private Regex domainRegex;
- private Regex pathRegex;
- public string Domain { get; set; }
- public DomainRoute(string domain, string url, RouteValueDictionary defaults)
- : base(url, defaults, new MvcRouteHandler())
- {
- Domain = domain;
- }
- public DomainRoute(string domain, string url, RouteValueDictionary defaults, IRouteHandler routeHandler)
- : base(url, defaults, routeHandler)
- {
- Domain = domain;
- }
- public DomainRoute(string domain, string url, object defaults)
- : base(url, new RouteValueDictionary(defaults), new MvcRouteHandler())
- {
- Domain = domain;
- }
- public DomainRoute(string domain, string url, object defaults, IRouteHandler routeHandler)
- : base(url, new RouteValueDictionary(defaults), routeHandler)
- {
- Domain = domain;
- }
- public override RouteData GetRouteData(HttpContextBase httpContext)
- {
- // 构造 regex
- domainRegex = CreateRegex(Domain);
- pathRegex = CreateRegex(Url);
- // 请求信息
- string requestDomain = httpContext.Request.Headers["host"];
- if (!string.IsNullOrEmpty(requestDomain))
- {
- if (requestDomain.IndexOf(":") > 0)
- {
- requestDomain = requestDomain.Substring(0, requestDomain.IndexOf(":"));
- }
- }
- else
- {
- requestDomain = httpContext.Request.Url.Host;
- }
- string requestPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + httpContext.Request.PathInfo;
- // 匹配域名和路由
- Match domainMatch = domainRegex.Match(requestDomain);
- Match pathMatch = pathRegex.Match(requestPath);
- // 路由数据
- RouteData data = null;
- if (domainMatch.Success && pathMatch.Success)
- {
- data = new RouteData(this, RouteHandler);
- // 添加默认选项
- if (Defaults != null)
- {
- foreach (KeyValuePair<string, object> item in Defaults)
- {
- data.Values[item.Key] = item.Value;
- }
- }
- // 匹配域名路由
- for (int i = 1; i < domainMatch.Groups.Count; i++)
- {
- Group group = domainMatch.Groups[i];
- if (group.Success)
- {
- string key = domainRegex.GroupNameFromNumber(i);
- if (!string.IsNullOrEmpty(key) && !char.IsNumber(key, 0))
- {
- if (!string.IsNullOrEmpty(group.Value))
- {
- data.Values[key] = group.Value;
- }
- }
- }
- }
- // 匹配域名路径
- for (int i = 1; i < pathMatch.Groups.Count; i++)
- {
- Group group = pathMatch.Groups[i];
- if (group.Success)
- {
- string key = pathRegex.GroupNameFromNumber(i);
- if (!string.IsNullOrEmpty(key) && !char.IsNumber(key, 0))
- {
- if (!string.IsNullOrEmpty(group.Value))
- {
- data.Values[key] = group.Value;
- }
- }
- }
- }
- }
- return data;
- }
- public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
- {
- return base.GetVirtualPath(requestContext, RemoveDomainTokens(values));
- }
- public DomainData GetDomainData(RequestContext requestContext, RouteValueDictionary values)
- {
- // 获得主机名
- string hostname = Domain;
- foreach (KeyValuePair<string, object> pair in values)
- {
- hostname = hostname.Replace("{" + pair.Key + "}", pair.Value.ToString());
- }
- // Return 域名数据
- return new DomainData
- {
- Protocol = "http",
- HostName = hostname,
- Fragment = ""
- };
- }
- private Regex CreateRegex(string source)
- {
- // 替换
- source = source.Replace("/", @"\/?");
- source = source.Replace(".", @"\.?");
- source = source.Replace("-", @"\-?");
- source = source.Replace("{", @"(?<");
- source = source.Replace("}", @">([a-zA-Z0-9_]*))");
- return new Regex("^" + source + "$");
- }
- private RouteValueDictionary RemoveDomainTokens(RouteValueDictionary values)
- {
- 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_]*})*-?\.?\/?");
- Match tokenMatch = tokenRegex.Match(Domain);
- for (int i = 0; i < tokenMatch.Groups.Count; i++)
- {
- Group group = tokenMatch.Groups[i];
- if (group.Success)
- {
- string key = group.Value.Replace("{", "").Replace("}", "");
- if (values.ContainsKey(key))
- values.Remove(key);
- }
- }
- return values;
- }
- }
- public class DomainData
- {
- public string Protocol { get; set; }
- public string HostName { get; set; }
- public string Fragment { get; set; }
- }
如果项目是MVC4.0那么就打开App_Start 文件夹下面的RouteConfig.cs路由配置文件,如果是MVC3.0项目则添加路由,Global.asax 文件默认的MVC 路由的代码
- public static void RegisterRoutes(RouteCollection routes)
- {
- routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
- routes.MapRoute(
- "Default",
- "{controller}/{action}/{id}",
- new { controller = "Home", action = "Index", id = UrlParameter.Optional }
- );
- }
修改后的路由如下:
- public static void RegisterRoutes(RouteCollection routes)
- {
- routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
- routes.Add(
- "@DomainRoute", new DomainRoute(
- "abc.com",
- "{controller}/{action}/{id}",
- new { controller = "Home", action = "Index", id = UrlParameter.Optional }
- ));
- routes.Add(
- "wwwDomainRoute", new DomainRoute(
- "www.abc.com",
- "{controller}/{action}/{id}",
- new { controller = "Home", action = "Index", id = UrlParameter.Optional }
- ));
- routes.Add(
- "DomainRoute", new DomainRoute(
- "{CityNameUrl}.abc.com",
- "{controller}/{action}/{id}",
- new { CityNameUrl = "", controller = "Home", action = "City", id = "" }
- ));
- routes.MapRoute(
- name: "Default",
- url: "{controller}/{action}/{id}",
- defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
- );
- }
当然这个路由解析匹配顺序是按照你们的需求去修改,但是路由匹配规则是从上到下的找符合的一条进行匹配,如果匹配到则不继续往下走,还需要说明一点, 我的域名是在万网注册的。所以还需要在域名解析那一块添加一条泛解析规则:
然后再程序中获取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设置二级域名的方法的更多相关文章
- 织梦dedecms移动版设置二级域名的方法 织梦如何设置m.开头的域名
dedecms/' target='_blank'>织梦dedecms建站系统自从2015.06.18号升级后,系统增加了最强的手机站功能,模板与PC模板分开,标签90%类似,数据同步,很牛很强 ...
- 借助微软提供的url重写类库URLRewriter.dll(1.0)实现程序自动二级域名,域名需要泛解析
二级域名和系统中会员帐号自动关联,也就是系统中注册一个会员,会员自动就可以通过二级域名来访问,比如我的帐号是zhangsan,我在morecoder.com注册后,访问zhangsan.morecod ...
- asp.net MVC把Areas区域绑定成二级域名
先分析需求 在MVC项目中,我们如果有两个Areas.比如Test和DEMO.我们的访问地址应该是 http://localhost:8098/test http://localhost:8098/d ...
- 设置二级域名共享一级域名Cookie和删除共享Cookie
设置共享Cookie: 二级域名要想共享一级域名的cookie,只需要设置cookie.Domain = ".一级域名.com"; 删除共享Cookie: HttpCook ...
- django 项目部署在 Apache 后, 设置二级域名(Apache虚拟主机 、 万网二级域名设置)
上一篇文章简单说了怎么把django的项目部署到Apache上. 现在想弄个二级域名,也就是我原来有个域名 www.mysite.com,现在我想弄个 bbs.mysite.com ,该怎么做呢. 要 ...
- ASP.net获取当前页面的文件名,参数,域名等方法
ASP.net后台获取当前页面的文件名 System.IO.Path.GetFileName(Request.Path).ToString(); 获取当前页面文件名,参数,域名等方法 假设当前页完整地 ...
- Apache设置二级域名和虚拟主机
apache httpd.conf 最后: ------------------------------NameVirtualHost *:80<VirtualHost *:80> ...
- 在ExpressJS中设置二级域名跨域共享Cookie
问题:我使用expressjs和mongostore来管理session.下面是expressjs中的设置. app.configure(function(){ app.use(express.ses ...
- apache虚拟主机设置泛域名的方法
在apache虚拟主机中设置泛域名解析,主要是用到ServerAlias 的配置. 1.支持多域名 例如,让mail.jbxue.org.smtp.jbxue.org.pop3.jbxue.org 都 ...
随机推荐
- 搭建ngrok服务器(ubuntu 14)-- 微信 80端口和IPC备案限制解决方案
概述: ngrok其实这东西,我也不是很懂,所以也直接跟大家说,这就是个类似花生壳的东西. 简单来说,它就好像把我们内网自己使用的电脑和服务器用vpn连接起来,然后你的电脑就可以从互联网来访问了,有个 ...
- web项目环境搭建(3):搭建Spring+MyBatis
spring 4.1.7 + MyBatis 3.3 正式开始配置关键内容,这是硬货 一. 新建spring配置文件,起名为 applicationContext.xml,放在src/main/res ...
- (原)C++中指针不初始化就传递的问题
C++中指针的使用.以前在使用指针之前都会初始化.今天没有初始化,然后指针传递后没有内容(testptrnoret),后来发现返回指针的话(testptrret),就可以了. // testptr.c ...
- JAVA classpath, 纠正我一直以来错误的认知
如何调在CLI中使用java tool(JDK中的java命令)调用一个打包在jar中的类,我想大多数人都能给出笼统的方案: java -classpath xxxxx com.test.classA ...
- cocos2d-x 工程目录结构说明
下载最新的cocos2d-x,解压完之后呈现出如下的目录结构: cocos2dx:框架核心目录,里面是存放了2dx引擎的核心代码. CocosDenshion:各个平台的音效实现. document: ...
- Python学习之--异常处理
Python中的Exceptions是所有异常的基类,内置的异常类都放在了exceptions模块中,通过dir()函数可以看到这些内置的类 通过raise 语句触发异常,如 >>> ...
- MyEclipse 点击 部署 按钮 无效的解决办法
问题描述 1 通常情况下,当我们点击MyEclipse任务栏上的部署按钮时,会弹出项目部署框,如下图: 2 但我们有时也会遇到点击部署按钮怎么也弹不出项目部署框的问题. END 解决方法一: 1 ...
- RMAN-06023: no backup or copy of datafile 6 found to restore
一:问题描述 我用指定备份集恢复时,报错: RMAN> run { 2> shutdown immediate; 3> startup mount; 4> allocate c ...
- C++ wstring string char* wchar_t相互转换
标签: stringwstringwchar_tcharc++2013-12-19 00:29 3721人阅读 评论(0) 收藏 举报本文章已收录于: C++知识库 分类: C/C++(50) 1. ...
- myEclipse异常解决:Errors occurred during the build. Errors running builder Mule 3 hot deployment
选择一个项目—-右键Properties—-Builders—-取消 “JavaScript Validator” 和 Mule 3 hot deployment 的勾就OK了 根据具体异常,勾选. ...