虚拟主机实现“泛解析”解决方案
文章伊始,我先要说明本文提到到的“泛解析”,不是真正意义上的泛解析,而是在虚拟主机中模拟泛解析以实现一个虚拟主机跑多个网站或实现将子目录转换为二级域名的目的!
一、类似解决方案及其优缺点:
1、利用微软提供的URLRewriter.DLL及ActionlessForm.DLL实现URL重写和表单Action属性修改。此方案仅支持对请求的PATH部分进行解析重定向,没法实现对HOST部分解析,亦不能实现一个虚拟主机跑多个网站的目的。但不需服务器加载其他组件。
2、利用ISAPI_Rewriter这个IIS服务器扩展来实现这一目的。但ISAPI_Rewriter属于商业软件需要付费购买(Full版其售价:$99,Lite版免费),需要虚拟主机服务商购买。Lite版功能极其有限,不能实现单个虚拟主机一个配置文件,这样用户没法自己修改自己的URLRewrtier配置文件;其次,该服务器扩展需要安装在服务器上,对于一般购买虚拟主机的朋友来讲,这极其不方便实现;最最最关键的一个原因,如果该服务器扩展安装到服务器之后,用户完全可以通过使用该扩展及同一主机绑定多个域名实现一个虚拟主机跑多个网站的目的,对于虚拟主机服务商来讲就减少了收入,所以多数虚拟主机服务器是不会加装该服务器扩展。
二、我的解决方案:
1、新建BasePage类,该类从System.Web.UI.Page派生而来,并重写OnPreLoad(EventArgs e)事件。代码如下:
2using System.Data;
3using System.Collections;
4using System.Collections.Generic;
5using System.Configuration;
6using System.Web;
7using System.Web.Security;
8using System.Web.UI;
9using System.Web.UI.HtmlControls;
10using System.Web.UI.WebControls;
11using System.Web.UI.WebControls.WebParts;
12
13namespace EnterpriseSiteFactory
14{
15 public class BasePage : System.Web.UI.Page
16 {
17 public SiteConfig SubSiteConfig { get; set; }
18 protected override void OnPreLoad(EventArgs e)
19 {
20 string SiteHost = Request.ServerVariables["HTTP_HOST"].ToLower();
21 if (!SiteConfigDict.ContainsKey(SiteHost))
22 SiteHost = global::System.Configuration.ConfigurationManager.AppSettings["DefaultSiteHost"];
23 SubSiteConfig = SiteConfigDict[SiteHost];
24 SiteConfigDict = null;
25 base.OnPreLoad(e);
26 }
27 }
28}
29
2、在Global类中的protected void Application_Start(object sender, EventArgs e)事件中初始化多站点配置。代码如下:
2 {
3 Dictionary<string, SiteConfig> SiteConfigDict = new Dictionary<string, SiteConfig>();
4 System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
5 xmlDoc.Load(Server.MapPath("~/GameList.xml"));
6 foreach (System.Xml.XmlNode node in xmlDoc.DocumentElement.ChildNodes)
7 {
8 SiteConfig sc = new SiteConfig();
9 sc.Id = node.SelectSingleNode("Id").InnerText;
10 sc.Name = node.SelectSingleNode("Name").InnerText;
11 sc.Title = node.SelectSingleNode("Title").InnerText;
12 sc.Keywords = node.SelectSingleNode("Keywords").InnerText;
13 sc.Description = node.SelectSingleNode("Description").InnerText;
14 if (!SiteConfigDict.ContainsKey(sc.Id.ToLower()))
15 {
16 SiteConfigDict.Add(sc.Id.ToLower(), sc);
17 }
18 }
19 xmlDoc = null;
20 if (Application[CoreLib.SiteConfigDict] == null)
21 Application.Add(CoreLib.SiteConfigDict, SiteConfigDict);
22 else
23 Application[CoreLib.SiteConfigDict] = SiteConfigDict;
24 }
3、SiteConfg类(可根据需要自行扩展)代码如下:
2using System.Data;
3using System.Configuration;
4using System.Web;
5using System.Web.Security;
6using System.Web.UI;
7using System.Web.UI.HtmlControls;
8using System.Web.UI.WebControls;
9using System.Web.UI.WebControls.WebParts;
10
11namespace EnterpriseSiteFactory
12{
13 public class SiteConfig
14 {
15 public string Id { get; set; }
16 public string Name { get; set; }
17 public string Title { get; set; }
18 public string Keywords { get; set; }
19 public string Description { get; set; }
20 }
21}
4、在开发过程中,每个页面的基类用BasePage类代替System.Web.UI.Page类,可以直接使用this.SubSiteConfg来获取站点相关信息。
5、在虚拟主机控制面板为该虚拟主机绑定多个域名(通常虚拟主机服务商限制为20个),并将这些域名解析到该虚拟主机的IP。
6、修改多站点配置文件SiteList.XML。代码如下:
2<SiteList>
3 <Site>
4 <Id>www.xxx.com</Id>
5 <Name>笑嘻嘻网站</Name>
6 <Title>笑嘻嘻哇哈哈</Title>
7 <Keywords>信息,想法</Keywords>
8 <Description>全球最大,最完善的笑嘻嘻网站!</Description>
9 </Site>
10 <Site>
11 <Id>www.xxx2.com</Id>
12 <Name>笑嘻嘻网站2</Name>
13 <Title>笑嘻嘻哇哈哈2</Title>
14 <Keywords>信息,想法2</Keywords>
15 <Description>全球最大2,最完善的笑嘻嘻网站!</Description>
16 </Site>
17</SiteList>
此方案可以在虚拟主机环境下实现“泛解析”。有一定局限性,但是用于企业站建设足够了。小弟才疏学浅,望各位大哥指点。