网站首页
手机版

实现多个域名分别绑定到子目录

更新时间:2006-02-05 00:00:00作者:未知

目前虚拟主机商提供将多个域名绑定到站点根目录,但是不提供类似cpanel那样可以将域名绑定到站点的子目录。
而当你手上有多个域名,网站空间和流量又有闲置的时候,是很希望
将这些资源利用起来,而且要做到降低做站的成本。而网络上流传的多域名绑到子目录多为判断HTTP_HOST再使用Asp的Response.Redirect或者php的header方法重订向到子目录去。这种方法在地址的请求上发生了变化,大家都知道Redirect的定向是很不友好的,在服务器端控制自动跳转会令访问者感到不安。
所以我需要的是对这个域名下面的所有请求都转接到对应的子目录里去
比如
http://www.xaradio.com/default.aspx
实际访问的是
http://www.3pub.com/xaradio/default.aspx
http://www.xaradio.com/album.aspx?id=722
实际访问的是
http://www.3pub.com/xaradio/album.aspx?id=722
http://www.xaradio.com/*.aspx
实际要访问到http://www.3pub.com/xaradio/*.aspx
而绑定到该站点根目录的其他域名和地址仍然不受影响
如:
http://www.3pub.com/

http://3pub.com/

http://www.3pub.com/default.aspx

http://3pub.com/default.aspx
http://www.aspxboy.com/484/default.aspx
该文章详细的描述了在Asp.Net中使用HttpModule和HttpHander来重写Url,读懂他特别是
http://www.aspxboy.com/484/archive.aspx#ekaa
节将是我们下面工作的前提朋友们可以下载该文章附带的代码研究。
如果您对HttpModule的编成非常熟悉那么可以向下进行了
一。 先把配置文件从web.config内移出为了不让web.config变的非常臃肿,我们将配置文件从web.config内移出
假设我们的多域名绑定配置文件为“MulitDomain.config“
将RewriterConfiguration.cs的public static RewriterConfiguration GetConfig()方法
修改如下:

/// 从XML配置文件中返回重写信息
///
/// RewriterConfiguration
public static RewriterConfiguration GetConfig()
{
RewriterConfiguration config = (RewriterConfiguration) BoovooCache.Get(CacheKey);
if(config == null)
{
// 2005-08-18 wu meibo update the config file to SiteUrls.config
// HttpContext.Current.Cache.Insert("RewriterConfig", ConfigurationSettings.GetConfig("RewriterConfig"));
///************************************************************************************
/// 
///  Author:活靶子,huobazi
/// Date:2005-08-18
///
///  Description:将配置文件移到单独的文件内,更新以下代码,原代码(上一行)停止工作
///
///************************************************************************************
string filePath = String.Empty;
if(HttpContext.Current != null)
{
filePath = HttpContext.Current.Server.MapPath("~/MulitDomain.config");
}
else
{
filePath = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + "MulitDomain.config";
}
XmlSerializer ser = new XmlSerializer(typeof(RewriterConfiguration));
FileStream fileReader = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
StreamReader reader = new StreamReader(fileReader);
config = (ser.Deserialize(reader)) as RewriterConfiguration;
reader.Close();
fileReader.Close();
if (File.Exists(filePath))
{
CacheDependency dep = new CacheDependency(filePath);
BoovooCache.Max(CacheKey,config,dep);
BoovooCache.ReSetFactor(config.CacheFactor);
}
}
return config;
}
二。做一些修补
RewriterModule.cs内


public virtual void Init(HttpApplication app)
{
///**********************************************************************************
///  Author:活靶子,huobazi
/// Date:2005-08-18
///  Description:增加BeginRequest,在内增加防止黑客可能利用的某些Url漏洞攻击的代码
///**********************************************************************************
app.BeginRequest += new EventHandler(this.RewriterModule_BeginRequest);
// 警告!此代码不适用于 Windows 身份验证!
// 如果使用 Windows 身份验证,
// 请改为 app.BeginRequest
app.AuthorizeRequest += new EventHandler(this.RewriterModule_AuthorizeRequest);
} protected virtual void RewriterModule_BeginRequest(object o , EventArgs e)
{
HttpApplication app = ((HttpApplication)(o));
HttpServerUtility Server = app.Server;
HttpRequest Request = app.Request;
///************************************************************
///  Author:活靶子,huobazi
/// Date:2005-08-18
/// Description:修补黑客可能采用".."的方法进入其他目录的问题
///************************************************************
string strURL = Server.UrlDecode(Request.RawUrl);
if (strURL.IndexOf("..") != -1)
{
throw new HttpException(404, "Not Found");
}
///**********************************************************************************
///  Author:活靶子,huobazi
/// Date:2005-08-18
/// Description:修补"规范化"问题 see: http://support.microsoft.com/?kbid=887459
///***********************************************************************************
if (Request.Path.IndexOf('') >= 0 ||
Path.GetFullPath(Request.PhysicalPath) != Request.PhysicalPath)
{
throw new HttpException(404, "Not Found");
}
}
三。开始匹配域名


protected void Rewrite(string requestedPath, System.Web.HttpApplication app)
{
string host = app.Context.Request.Url.Host.ToString().ToLower();

app.Context.Trace.Write("RewriterModule", "Entering ModuleRewriter");  
RewriterRuleCollection rules = RewriterConfiguration.GetConfig().Rules;
for(int i = 0; i < rules.Count; i++)
{//将MulitDomain.config内定义的规则LookFor的值逐个匹配当前主机名判断否被定义了需要重写
//如果匹配则需要重写,那将请求重写到SendTo定义的目录内的该文件
string lookFor = "^" + rules[i].LookFor + "$";
//string lookFor = "^" + Rewriter.ResolveUrl(app.Context.Request.ApplicationPath, rules[i].LookFor + requestedPath) + "$";
Regex re = new Regex(lookFor, RegexOptions.IgnoreCase);
if (re.IsMatch(host))
{
string sendToUrl = Rewriter.ResolveUrl(app.Context.Request.ApplicationPath,  rules[i].SendTo + requestedPath);
app.Context.Trace.Write("RewriterModule", "Rewriting URL to " + sendToUrl);
Rewriter.RewriteUrl(app.Context, sendToUrl);
break;
}
}
app.Context.Trace.Write("RewriterModule", "Exiting ModuleRewriter");
}
四。写规则文件
MulitDomain.config的匹配规则如下:


<?xml version="1.0" encoding="utf-8" ?>
<RewriterConfig>
<Rules>
  <RewriterRule>
   <LookFor>www.xaradio.com</LookFor>
   <SendTo>~/xaradio</SendTo>
  </RewriterRule>
  <RewriterRule>
   <LookFor>xaradio.com</LookFor>
   <SendTo>~/xaradio</SendTo>
  </RewriterRule>
</Rules>
  </RewriterConfig>
 
最后说明一下,根目录下一定要有一个Default.aspx如果你的所有域名都按照这种方式“绑定”那么根目录下放置一个空Default.aspx就可以,该文件来“欺骗IIS” ,防止直接使用域名访问的时候IIS查找不到default或者index文件就报404错误,等到该检查过去之后权利已经移交到aspnet_isapi.dll那里了。

本文标签:

为您推荐

IT市场初长成

1. 合肥IT业(市场)现状 合肥,位于安徽省中部,可辐射面积大;背靠内陆一些欠发达的地区如大别山区。由于历史、体制等方面的原因,信息化建设起步晚,基础薄,合肥地区生产计算机及其外围设备、通信器材产品的企业很少,基本上完全是一个消费性市场,无论是规模还是

2011-11-10 16:10

定性仿真综述

本文首先介绍了定性仿真的产生背景及理论发展状况,然后说明了定性仿真在各领域的应用情况,最后对定性仿真的发展方向进行了探讨。

2011-11-10 16:06

关于计算机普及教育的几个问题

一、当前计算机普及的形势 一般理论课程采用的方法是∶先理论,后实际;先抽象,后具体;先一般,后个别。我认为对计算机应用课程应当采用的方法是∶从实际到理论;从具体到抽象;从个别到一般;从零碎到系统。事实证明,这样的方法是十分有效的,是符合广大计算机初学

2011-11-10 16:05

新世纪的软件产业与集成电路产业

为推动我国信息产业和集成电路的发展,增强信息产业创新能力和国际竞争能力,带动传统产业改造和产品升级换代,国家实行集成电路税收优惠、软件企业上市优先的政策,国务院已于1999年7月印发了《鼓励软件产业和集成电路产业发展的若干政策》。 为打破几十年来,国内硬

2011-11-10 16:04

定性仿真理论及其应用

本文首先介绍了定性仿真的产生背景及理论发展状况,然后说明了定性仿真在各领域的应用情况,最后对定性仿真的发展方向进行了探讨。

2011-11-10 16:03

浅谈中职学校计算机理论课程教学的改革

计算机 作为现代高科技的产物,其理论知识专业性强。并且,教师不注意教学方法的选择,学生接受起来有很大困难,学生普遍反映计算机理论课程太难、太枯燥。笔者从中职学校的计算机理论课程的培养目标出发,通过对中职学校的计算机理论课程的教学目标与教学现状存在弊端

2011-11-10 16:01

加载中...