Eric Chan ’ s programming lives

抉择比努力奋斗更重要。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

ASP.NET实现二级域名(多用户,多商店)

Posted on 2014-08-04 14:00  Eric Chan  阅读(499)  评论(0编辑  收藏  举报

本人所了解有两种方案,可能还有其的方式,希望大家多多讨论!  基本思路:  1. 域名支持泛解析,即是指:把A记录 *.域名.com 解析到服务器IP,服务器IIS中做绑定,绑定时主机头为空 2. 为了实现完全的二级域,建两个站点,一个为主站用,一个为用户用,两个站点目录都指到一个同一网站目录  3. Web程序中或取URL来源中的二级域名主机头,比如:abc.域名.com 中的 abc;  4. 用获取来的二级域名名称,存入Session,方便取用  5. 用获取来的二级域名名称,用URL重写地址  实现方法:  域名A记录解析不用说了吧 ^_^,就是做一个*.域名.comA记录解析到你服务器IP 

方法一:二级域名URL转向  a. 建立站点,在IIS中绑定域名(win2003 - IIS6)  打开IIS,右击站点,然后属性,点击网站项IP地址的高级按钮,然后点编辑或添加来新增绑定,主机头值为空

下面来获取URL地址进行分析,下面是过程代码,用来获取及判断主机头,代码放在默认文档的首文件Index.aspx.cs中 

代码 /// summary>  ///取得二级域主机头值,并实行转向  /// /summary>  public void CheckDomain() 

HostName = HttpContext.Current.Request.Url.Host.ToString(); //获取URL主机地址  UserHost = HostName.Split(new Char[] { '.' }); //数组,以“.”分隔

//判断二级域名地址是否符合abc.域名.com 这种格式,及数组UserHost长度不大于3,否则就跳传到其它页  if (UserHost.Length > 3)  HttpContext.Current.Response.Redirect("http://www.域名.com/Error.aspx"); //跳转到出错页面  return; 

UserDomainName = UserHost[0].ToString(); //取得数组最前面一组值,及二级域名主机头 

//进行特定判断,及是不要用到做为二级域名的主机头  if (UserDomainName.ToLower() == "www"    UserDomainName.ToLower() == "域名   UserDomainName == null    UserDomainName.ToString()=="") 

//你的动作  else {  HttpContext.Current.Response.Redirect("/User/"); //跳转到用户目录,即是二级域名所要去到的目录,当然你也可以跳传至*.aspx?UserID=xxx这样的链接  return; 

}

到这里已经可以实现abc.域名.com跳转到指定的页面或链接了,但并不是真正的二级域名,只是URL转向而已。 

方法二:真正的二级域名  a . 建立站点  此时我们需要建立两个站点,一个主站点、一个二级域站点,二个站点的文件目录为同一目录,其目录中有Default.aspxIndex.aspx两个文件。建立方法如下:  a). 主站点建立方法参照方法一中的站点建立,不过,主机头非空,需设为www.域名.com 与 域名.com ,当然,你也可以设置其它不想用来做二级域的主机头。站点默认访问文档为:Default.aspx。 

b). 二级域站点建立方法与方法一中的站点建立一样,其默认访问文档为:Index.aspx。 

b.现在我们要用到之前建立的二级域站点,我们将用户的数据放在根目录下的User目录中。  下面是/User目录中默认文档(Index.aspx.cs)的过程代码,主要用途是将二级域名主机头存入Session,方便调用,也是二级域(用户区)的首页文件 

代码 /// summary>  ///取得二级域主机头值,存入Session["UserDomainName"]中  /// /summary>  public void UserDomainNameSession()  HostName = HttpContext.Current.Request.Url.Host.ToString(); //获取URL主机地址  UserHost = HostName.Split(new Char[] { '.' }); //数组,以“.”分隔

//判断二级域名地址是否符合abc.域名.com 这种格式,及数组UserHost长度不大于3,否则就跳传到其它页  if (UserHost.Length > 3)  HttpContext.Current.Response.Redirect("http://www.域名.com//Error.aspx"); //跳转到出错页面  return; 

UserDomainName = UserHost[0].ToString(); //取得数组最前面一组值,及二级域名主机头 

//进行特定判断,及是不要用到做为二级域名的主机头  if (UserDomainName.ToLower() == "www"    UserDomainName.ToLower() == "域名   UserDomainName == null    UserDomainName.ToString()=="")  //你的动作  else  HttpContext.Current.Session["UserDomainName"] = UserDomainName; //将二级域名主机头存入Session 

//你对Session["UserDomainName"]的处理,比如把这个Session["UserDomainName"]的值是“abc”,那么你可以index.aspx?UserName=abc,如果不想使用Session,你可以在需要用到二级域主机头时,再来通过URL地址获取。

c. URL重写  我用的是微软的URLRewriter,使用方法参见:http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.......g.mspx?mfr=true  web.config 中的重写方法是: 

代码: [ 复制到剪贴板  RewriterRule>  LookFor~/Index.aspx/LookFor>  SendTo~/User/Index.aspx/SendTo>  /RewriterRule> 

 

方法二级域名的访问方案实现原理代码如下

            string str = System.Web.HttpContext.Current.Request.Url.Host.ToString();

 

            string aburl = System.Web.HttpContext.Current.Request.Url.AbsoluteUri.ToString();

 

            string strr = System.Web.HttpContext.Current.Request.QueryString.ToString();

 

            string strurl = System.Web.HttpContext.Current.Request.Url.PathAndQuery.ToString();

 

            string[] strlist = str.Split(new char[] { '.' });

            string tb = strlist[0].ToString();

 

 

            if (strlist.Length >= 3)

            {

 

 

                if (tb.ToLower() == "www" 

                {

 

                    if (strr.ToLower().Contains("sjid"))

                    {

                        string[] strl = System.Text.RegularExpressions.Regex.Split(strr, "&", System.Text.RegularExpressions.RegexOptions.IgnoreCase);

                        int sid = Convert.ToInt32(System.Text.RegularExpressions.Regex.Split(strl[0], "=", System.Text.RegularExpressions.RegexOptions.IgnoreCase)[1]);

                        if (new ConfigDB().Getissdo() == "1")

                        {

                            if (tb.ToLower() == "192" || tb.ToLower() == "127")

                            {

                                Response.Redirect("http://" + str + "/UserWeb/" + sy.Getmb(sid) + strurl);

                            }

                            else

                            {

                                Response.Redirect("http://" + str.Replace("www", sy.GetSjuserByID(sid)).Replace("cp1", sy.GetSjuserByID(sid)) + strurl);

                            }

                        }

                        else

                        {

                            if (tb.ToLower() == "192" || tb.ToLower() == "127")

                            {

                                Response.Redirect("http://" + str + "/UserWeb/" + sy.Getmb(sid) + strurl);

                            }

                            else

                            {

                                Response.Redirect("" + weburl + "/UserWeb/" + sy.Getmb(sid) + strurl);

                            }

                        }

                    }

 

                }

                else

                {

                    if (!sy.SupplyMemberNameExistt(strlist[0].ToString()))

                    {

 

                        System.Web.HttpContext.Current.Response.Write(getym("" + weburl + "/error.aspx"));

                        Response.End();

                        return;

 

                    }

                    else

                    {

 

                        SqlDataReader sdr = sy.GetAdminDetailsByname(strlist[0].ToString());

                        string mb = string.Empty;

                        string cid = string.Empty;

                        while (sdr.Read())

                        {

                            mb = sdr["mb"].ToString();

 

                            cid = sdr["id"].ToString();

                        }

                        sdr.Close();

                        if (!strurl.ToLower().Contains("?"))

                        {

                            if (strurl.ToLower().Contains("html"))

                            {

                                if (strurl.ToLower().Contains("default"))

                                {

                                    Response.Redirect(weburl);

                                    Response.End();

                                    return;

                                }

                                else

                                {

                                    System.Web.HttpContext.Current.Response.Write(getym("" + weburl + "/" + strurl + ""));

                                    Response.End();

                                    return;

                                }

                            }

                            else

                            {

          

                                System.Web.HttpContext.Current.Response.Write(getym("" + weburl + "/UserWeb/" + mb + "/index.aspx?sjid=" + cid + ""));

                                Response.End();

                                return;

                            }

 

                        }

                        else

                        {

       

                            System.Web.HttpContext.Current.Response.Write(getym("" + weburl + "/UserWeb/" + mb + "/" + strurl + ""));

                            Response.End();

                            return;

 

                        }

                    }

                }

            }