MVC实现二级域名泛解析

  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          // Build regex
 35          domainRegex = CreateRegex(Domain);
 36          pathRegex = CreateRegex(Url);
 37
 38          // Request information
 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          // Match domain and route
 54          Match domainMatch = domainRegex.Match(requestDomain);
 55          Match pathMatch = pathRegex.Match(requestPath);
 56
 57          // Route data
 58          RouteData data = null;
 59          if (domainMatch.Success && pathMatch.Success)
 60          {
 61              data = new RouteData(this, RouteHandler);
 62
 63              // Add defaults first
 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              // Iterate matching domain groups
 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              // Iterate matching path groups
 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          // Build hostname
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 domain data
127          return new DomainData
128          {
129              Protocol = "http",
130              HostName = hostname,
131              Fragment = ""
132          };
133      }
134
135      private Regex CreateRegex(string source)
136      {
137          // Perform replacements
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  }

routes.Add("DomainRoute", new DomainRoute(

      "home.example.com",                                     // Domain with parameters

      "{action}/{id}",                                        // URL with parameters

      new { controller = "Home", action = "Index", id = "" // Parameter defaults

  ));

 

时间: 2024-10-11 06:30:06

MVC实现二级域名泛解析的相关文章

UrlRewriter.dll伪静态实现二级域名泛解析

大家应该知道,微软的URLRewrite能够对URL进行重写,但是也只能对域名之后的部分进行重写,而不能对域名进行重写, 如:可将 http://http://www.115sou.com/qq/  重写为 http://www.115sou.com/show.aspx?id=qq 但不能将 http://qq.115sou.com/  重写为  http://www.115sou.com/index.aspx?id=qq. 要实现这个功能,前提条件就是  http://www.115sou.c

.net iis 域名泛解析实战

最近做个人网站想实现多个二级域名,一来为了好记,二来为了搜索引擎优化,搜索引擎对二级域名的收录还是比较快的.刚开始做了4,5个二级域名,每个都是在域名解析后台手动添加的,不过随着二级域名越来越多,发现这种方式太麻烦太累了,所以才想通过程序来实现多个二级域名的解析. 实现二级域名泛解析,首先要在域名管理后台添加一个泛解析 添加一条A记录 主机记录写成 *即可 如下图, 其次我们需要在iis上建立一个网站比如叫fanjiexi 主机头要留空 把默认页面设置为我们下面要用的页面fanjiexi.asp

域名泛解析设置

接前一篇<MVC实现动态二级域名>,前面我们说道MVC如何实现动态二级域名,其中也涉及到DNS服务器,也要做相应的泛域名解析设置. 1.什么是泛域名解析 泛域名解析是指将*.域名解析到同一IP.在域名前添加任何子域名,均可访问到所指向的WEB地址.也就是将 *.xxx.com(*代表所有合法二级域名头,如:bbs www news)指向同一IP,服务器就同时绑定了所有.xxx.com的二级域名,不需要一个个绑定.例如:博客,电商平台的店铺,qq空间等.都是通过动态的二级域名的泛域名解析来实现的

IIS_域名泛解析+泛绑定

域名泛解析 cname->主机二级域名,或a->主机IP IIS主机泛绑定,目前我只知道单IP下,只能泛绑定一个域名, 如果有更好的办法,请求指点. 测试php 测试二级域名 域名还没正式上线,期待跟大家见面,谢谢

VPS上域名泛解析设置方法

1.什么是泛域名解析? 泛域名解析是指将.域名解析到同一IP. 在域名前添加任何子域名,均可访问到所指向的WEB地址.也就是客户的域名http://a.com之下所设的.http://a.com全部解析到同一个IP地址上去. 比如客户设http://b.a.com就会自已自动解析到与http://a.com同一个IP地址上去. 2.泛域名解析域名域名解析的区别? 泛域名解析是:.域名解析到同一IP. 域名解析是:子域名.域名解析到同一IP. 注意:只有你的空间是独立IP的时候泛域名才有祝福短信意

域名解析和域名泛解析

域名解析和域名泛解析 由于建网站等一系列的需求现在注册域名的朋友是越来越多了,然而注册域名时经常会遇到一些不懂的问题,如域名解析和域名泛解析,不管你是CN域名注册用户还是com域名注册用户,都有可能域名域名解析和域名泛解析的问题,那么你知道什么是域名解析和域名泛解析么?下面我们就来了解下这方面的知识吧! 一.什么是域名解析? 域名解析就是域名到IP地址的转换过程.IP地址是网路上标识您站点的数字地址,为了简单好记,采用域名来代替ip地址标识站点地址.域名的解析工作由DNS服务器完成. 二.什么是

seo优化之域名泛解析优缺点分析

原文地址:http://www.phpddt.com/web/analysis-of-domain-name.html 自己也算半个SEOER,虽然没从事过优化工作,由于自己很感兴趣,每天还是会去看很多关于SEO文章.因为自己正想给博客开几个子域名,了解了下域名泛解析.域名泛解析是指将*.域名解析到同一IP.那么在域名前添加任何子域名,均可访问到所指向的WEB地址. 优点: 1.会增加网站收录. 2.防止用户输错网址不能访问,比如说用户输错网址ww.phpddt.com依然能够访问网站. 3.支

window server 2008 r2- Dns 泛解析 --任意二级域名自动解析同一个网站

Dns 泛解析 简介:泛解析,作用于dns 用于域名解析到对应的ip,泛解析只针对dns,iis是无法实现的(dns只有在服务器系统上才有) window server 2008 R2 在右键计算机,管理角色,添加dns 服务器 具体安装教程请看 http://www.jb51.net/os/windows/win2008/218523.html 二.配置解析说明 配置dns 服务器 具体可查看:http://www.chinaz.com/server/2007/0904/15597.shtml

ASP.NET MVC 域名泛解析设置

最近有个需求要做一个动态二级域名的网站,我们可以通过这样的方式去访问我们的网站 http://用户名.blog.com.而这里的用户名是根据程序的需要动态生成的.这里就会涉及到DNS服务器,要做相应的泛域名解析设置 1.在域名管理里面,增加一个*.xxx.com的次级域名A记录指向你的IP,如下图所示 2.在IIS添加网站站点的时候输入空主机名即可,如下图所示