`
water84222
  • 浏览: 372802 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

页面重定向----使用HttpModule实现多个域名分别“绑定”到子目录

阅读更多

目前虚拟主机商提供将多个域名绑定到站点根目录,但是不提供类似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.aspxhttp://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()方法
修改如下:

/// <summary></summary>/// 从XML配置文件中返回重写信息/// /// <returns></returns>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>
最后说明一下,根目录下一定要有一个Default.aspx如果你的所有域名都按照这种方式“绑定”那么根目录下放置一个空Default.aspx就可以,该文件来“欺骗IIS” ,防止直接使用域名访问的时候IIS查找不到default或者index文件就报404错误,等到该检查过去之后权利已经移交到aspnet_isapi.dll那里了。
 
分享到:
评论

相关推荐

    HttpModule二级域名 C#.Net实例代码

    此外,"iis配置.txt"文件可能包含了如何在IIS中设置二级域名的指南,例如创建一个新的站点或者绑定,以及如何将应用程序池配置为使用正确的.NET版本和托管管道模式。 最后,"App_Code"目录通常用于存放不包含在任何...

    HttpModule实现同时一人在线.rar

    在标题"HttpModule实现同时一人在线.rar"中,我们讨论的核心是利用HttpModule来限制同一时间只有一个用户在线。这通常涉及到会话管理、用户身份验证以及并发控制等概念。 HttpModule是IIS(Internet Information ...

    httpmodule实现权限管理

    如果用户尚未登录,我们可以重定向他们到登录页面。如果已登录,我们可以进一步检查角色或权限,如以下示例: ```csharp if (!HttpContext.Current.User.Identity.IsAuthenticated) { HttpContext.Current....

    Asp.net使用HttpModule压缩并删除空白Html请求的实现代码

    通过使用HttpModule来实现这些功能,开发者可以对所有页面请求进行统一的处理,而无需在每个页面或Web服务中单独编写压缩逻辑。这样不仅保证了代码的整洁和可维护性,还能够确保整个Web应用的性能得到提升。 最后,...

    利用httpmodule统计页面访问量

    在深入探讨如何利用HTTPModule来统计页面访问量之前,我们首先需要理解几个核心概念。HTTPModule是ASP.NET框架的一部分,它允许开发者在请求处理过程中插入自定义代码,从而实现对HTTP请求的深度定制与控制。这种...

    HttpModule伪静态实例

    这个【HttpModule伪静态实例】是一个用于演示如何通过HttpModule实现URL伪静态的技术方案,这对于提升网站SEO(搜索引擎优化)和用户体验具有重要意义。 首先,我们来看看什么是URL伪静态。静态URL通常是指以`....

    一个采用HttpModule技术实现Web网页的刷新保护程序源码例子

    在Web应用程序中,HttpModule扮演着中间件的角色,可以在请求到达实际的页面处理逻辑之前或之后执行自定义逻辑,如身份验证、缓存管理、日志记录、性能跟踪等。下面我们将深入探讨HttpModule的工作原理以及如何利用...

    HttpModule和httpHandler学习例子

    例如,你可以创建一个HttpModule来实现身份验证、日志记录、缓存管理或者URL重写等功能。 下面是一些关于HttpModule的关键点: 1. **注册HttpModule**:在`Web.config`文件中,我们需要在`system.web/httpModules`...

    HttpModule重写机制

    HttpModule重写机制则是利用HttpModule来实现URL重定向和URL隐藏,从而达到优化网站结构、提升SEO效果或者实现某些特定功能的目的。 **一、HttpModule的基本概念** HttpModule是ASP.NET中的一个核心组件,它是一个...

    HttpModule检验Session值

    如果Session为空或Cookie过期,我们可以采取相应的措施,如重定向到登录页面。 ```csharp private void Context_BeginRequest(object sender, EventArgs e) { HttpApplication app = (HttpApplication)sender; ...

    ASP.NET架构详解HttpHandler和HttpModule高清PDF文字版

    每个HttpModule都实现了IHttpModule接口,并且通过在`web.config`文件中注册,可以将它们添加到ASP.NET的请求处理管道中。 **ASP.NET请求流程**是这样的:客户端发起HTTP请求,服务器接收到请求后,IIS(Internet ...

    采用HttpModule技术进行以Ajax 方式的客户端回调处理类库源代码

    SlideShow程序案例可能是一个演示如何使用HttpModule实现实时更新图片展示的示例。这可能涉及从服务器获取新的图片数据,并在不刷新页面的情况下更新图片展示。 6. **应用场景** 使用HttpModule处理Ajax回调的应用...

    net实现定时任务(Cache+HttpModule)

    ### .NET 实现定时任务(Cache + HttpModule) 在.NET框架中实现定时任务可以通过多种方式完成,例如使用`System.Timers.Timer`、Windows服务、后台线程等。本文介绍一种较为特殊的实现方式:利用`HttpModule`和`...

    HttpModule

    HttpModule是ASP.NET框架中的一个核心组件,它在Web应用程序的生命周期中扮演着重要的角色。HttpModule主要用于处理HTTP请求和响应,提供了一种扩展IIS(Internet Information Services)功能的机制,使得开发者可以...

    介绍Asp.net HttpModule

    一个HttpModule是一个实现了IHttpModule接口的类,这个接口有两个主要方法:`Init(HttpApplication)` 和 `Dispose()`。`Init()` 方法在模块被加载到ASP.NET应用程序中时调用,用于初始化模块并注册事件处理程序;`...

    RegisterHttpModule 注册HttpModule

    HttpModule本身是一种特殊的类,它继承自`System.Web.IHttpModule`接口,并实现了初始化和清理两个方法:`Init(HttpApplication context)`和`Dispose()`。这些模块在每个HTTP请求开始时被调用,直到请求结束,从而...

    Url重写篇视频------本讲将通过实例比较ASP.NET下的三种典型URL重写方案

    回到前面的规则定义部分,我们就能发现,folder default page使用的是由IIRF这个ISAPI定义的规则,而另两个则使用的是内置于ASP.NET2.0的HTTPModule的重写规则(本质上,urlMappings也是使用HTTPModule来实现重写的...

    ASP.NET visual studio2008 URL域名重写

    总结来说,ASP.NET通过Visual Studio 2008提供的工具,配合Web.config配置和HttpModule,能够实现URL域名重写,从而提升网站的用户友好性和SEO性能。在具体实施时,需要理解配置文件的语法,编写合适的重写规则,并...

    asp.net用url重写URLReWriter实现任意二级域名 高级篇.docx

    在实现任意二级域名时,可以利用这个库对所有二级域名进行统一处理,例如将所有二级域名重定向到特定的处理程序。 **问题与解决** 在实际操作中可能会遇到的问题包括: 1. **泛解析**:泛解析是指设置DNS记录,使...

    Community Server专题三:HttpModule

    ### Community Server专题三:HttpModule #### IIS与动态页面处理机制 首先,为了更好地理解HttpModule的作用,我们需要从整体上了解IIS是如何处理请求的。IIS(Internet Information Services)是一个由微软提供...

Global site tag (gtag.js) - Google Analytics