多用户系统在网络上很常见,比如淘宝网或者携购网上的店铺就是最典型的多用户系统,每个店主都有一个自己二级域名的小店(如:http://shop88888888.xiegoo.com/),看上去大家都是各自独立的,但从技术曾面来看,其实每个店铺使用的都是同一套程序,唯一的差别就是店铺的界面和数据。
相信实现这样的二级域名指向不同店铺的功能,对大部分程序员来说不是件难事,因为shop后面的88888888里隐藏了店铺唯一的id,通过shop88888888把这个店铺的界面和数据从数据库里筛选出来是很简单的,我在这里也不详细解释。但是我们经常在网上看到很多“多用户商城”或者“建站系统”,支持绑定国际域名,比如携购旗下的独立网店系统http://www.shopxg.com/,只要在线注册,在线绑定国际域名,就能访问自己的网店了。笔者曾经参与开发shopxg,把如何实现这样的功能,拿出来与大家分享,当然可能不是最好最有效的方法,但希望能帮到那些正在为解决这个问题发愁的技术朋友。
因为shopxg是用.NET开发的,所以下面我讲到的情况可能不适合其他语言的系统,但原理是相通的,希望能给您一点启示。
第一步:设计数据库的时候,在“店铺shop”这张表里,要设置一个字段,存放国际域名;
第二步:在shopxg的站点上做泛解析,就是让任何指向到shopxg网站所在服务器的国际域名,都会绑定到shopxg上,至于如何做泛解析,您可以到google查下;
第三步:拿前台的index.aspx页面举例,当一个客户输入www.yifull.com/ShopLogin.aspx和www.tiaopidan.com/ShopLogin.aspx的时候,ShopLogin.aspx页面要马上获取到当前输入的域名,比如使用Request.ServerVariables["SERVER_NAME"].ToString();当然shopxg使用的是URLRewrite的重写技术来获取当前域名的,这样的方法有很多,您可以自己选择;
第四步:利用当前的域名,到数据库中精确匹配到某个店铺,然后把该店铺的数据取到前台显示;
当然上面的几步都是非常容易实现的,不是什么难题,但实现了一个多用户系统中每个店铺各自绑定国际域名之后,有很多小问题是不容忽视的:
1、每个页面频繁的获取当前域名,然后到数据库匹配,才知道是哪个店铺在请求数据,会导致系统效率低下,因此我们要让客户在第一次访问一个域名的时候,把获取回来的店铺编号放进本地cookies,当客户继续访问或者下次来访问的时候,直接从cookies里就能知道当前的域名对应的是哪个店铺了;
2、用户登陆问题:一般的网站都是使用cookies来存放我是否已经登陆某网站的信息的,对于多用户系统,如果用户登陆的时候,cookies没建好,很容易造成登陆一个网站,就相当于登陆该多用户系统上所有网站;假如可以随意登陆别人的网站后台,那后果将不堪设想;有时候甚至会造成我的定单里有别人的定单的情况,这都是cookies造成.因此我们在程序建cookies的时候,一定要区分域,在判断用户登陆的过程中,也要严格判断输入的域名和cookies中的域是否对应;
3、客户在绑定国际域名的时候,一定要判断客户的域名已经存在,并且已经指向了正确的ip,不然一经绑定,客户的网站就无法访问了;
//////获取域名指向的IP
public string GetIPByDomain(string url)
{
if (url.Trim() == string.Empty)
return "";
try
{
System.Net.IPHostEntry host = System.Net.Dns.GetHostByName(url);
return host.AddressList.GetValue(0).ToString();
}
catch (Exception e)
{
return "fail";
}
}
if(this.GetIPByDomain(this.tbDomian.Text)=="fail")
{
Response.Write(" ");
return;
}
if(this.GetIPByDomain(this.tbDomian.Text)!="202.91.243.151")
{
Response.Write(" ");
return;
}
4、在程序中任何查询的数据库的操作,必须提供店铺的id才能查询,这样才能避免有人发起恶意操作,把其他网店的信息查询出来.
当然,在实现多用户系统绑定国际域名的时候,会碰到很多其他问题,欢迎大家交流.我的E-mail : cxl@xiegoo.com