使用HttpModule实现多个域名分别“绑定”到子目录
来源:互联网 发布:东方头条 帝国cms 编辑:程序博客网 时间:2024/06/01 12:51
前虚拟主机商提供将多个域名绑定到站点根目录,但是不提供类似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
RewriterModule.cs内
MulitDomain.config的匹配规则如下:
而当你手上有多个域名,网站空间和流量又有闲置的时候,是很希望
将这些资源利用起来,而且要做到降低做站的成本。而网络上流传的多域名绑到子目录多为判断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配置文件中返回重写信息/// /// RewriterConfigurationpublic 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.BeginRequestapp.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 + "___FCKpd___3quot;;//string lookFor = "^" + Rewriter.ResolveUrl(app.Context.Request.ApplicationPath, rules[i].LookFor + requestedPath) + "___FCKpd___3quot;;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>
<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那里了。
- 使用HttpModule实现多个域名分别“绑定”到子目录
- 使用HttpModule实现多个域名分别“绑定”到子目录
- 使用HttpModule实现多个域名分别“绑定”到子目录
- 使用HttpModule实现多个域名分别绑定到子目录
- 页面重定向----使用HttpModule实现多个域名分别“绑定”到子目录
- 在Asp.Net中使用HttpModule实现多个域名分别“绑定”到子目录
- 使用HttpModule实现多个域名分别绑定到子目录URL Rewriter Module
- 使用.htaccess实现子域名绑定子目录
- 单台机器上设置多个域名,二级域名绑定到子目录
- 利用.htaccess将域名绑定到子目录
- 利用 .htaccess 绑定域名到子目录
- SAE开发:SAE绑定域名到子目录
- SAE如何绑定域名到子目录
- SAE如何绑定域名到子目录
- 域名绑定 到tomcat webapp 子目录配置
- 利用.htaccess绑定子域名到子目录
- 一个虚拟空间,不用子目录绑定功能实现建多站(一个空间绑定多个域名实现自动跳转的几种方法!)
- Nginx泛解析的匹配域名绑定到子目录配置
- S.OPEN SQL,CONN,A,B A,B参数
- 为什么要分词
- 我看过的IMDB Top250中的电影
- 致准备学习和初学Linux的兄弟
- 考考大家
- 使用HttpModule实现多个域名分别“绑定”到子目录
- Java秘史:隐藏在SWT/Swing背后的故事
- 应用级技术没含金量,还是业务伟大?
- 连接池的设置及简单应用示例
- 准备写个软件渲染engine了
- PHP分页显示制作详细讲解
- JAVA开发者应该去的20个英文网站
- Delphi:TMemoryStream类--二进制大对象与数据库的交互
- Avoiding Mutating Tables