基本思路:
1. 域名支持泛解析,即是指:把A记录 *.域名.com 解析到服务器IP,服务器IIS中做绑定,绑定时主机头为空;
2. 为了实现完全的二级域,建两个站点,一个为主站用,一个为用户用,两个站点目录都指到一个同一网站目录
3. 在Web程序中或取URL来源中的二级域名主机头,比如:abc.域名.com 中的 abc;
4. 用获取来的二级域名名称,存入Session,方便取用
5. 用获取来的二级域名名称,用URL重写地址
实现方法:
域名A记录解析不用说了吧 ^_^,就是做一个*.域名.com的A记录解析到你服务器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[] { '.' }); //数组,以“.”分隔
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;
}
}
方法二:真正的二级域名
a . 建立站点
此时我们需要建立两个站点,一个主站点、一个二级域站点,二个站点的文件目录为同一目录,其目录中有 Default.aspx 及 Index.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[] { '.' }); // 数组,以 “.” 分隔
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 地址获取。
我用的是微软的 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 >
到这里已经实现二级域了,不管输入什么样的主机头 (www. 域名 .com 与 域名 .com 除外,因为这两个域已经绑定到主站点中,优先访问到了主站点 ) ,就可以实现 abc. 域名 .com 访问到这个用户目录了,而且浏览器地址栏,出现的也是 abc. 域名 .com 这样的域名地址,为了保证此二级域访问其它页面也保持二级域名的属性,也需同时做 URL 重写,在其它页面如需用到二级域主机头 ( 用户名 ) ,从 Session["UserDomainName"] 中取得即可,比如,要在 User 目录中的文件 test.aspx ,显示二级域主机头名称,同时需保持浏览器地址栏地址为 : abc. 域名 .com/test.aspx ,那么在 web.config 中添加 URL 重写规则:
代码 : < RewriterRule >
< LookFor > ~/test/.aspx < /LookFor >
< SendTo > ~/User/test.aspx < /SendTo >
< /RewriterRule >
然后, test.aspx 自身通过获取 Session["UserDomainName"] 的值或通过 URL 或取,来显示二级域主机头名称。
当然,你也可以直接将二级域站点单独绑定到这个 User 用户目录,取得 URL 中的主机头 ( 用户名 ) ,但这样可能失去了与主站数据通讯的方便性。