海纳百川 有容乃大(http://www.brtech.com.cn)

海纳百川,有容乃大(http://www.brtech.com.cn)

  :: 首页 :: 博问 :: 闪存 :: :: 联系 :: 订阅 订阅 :: 管理 ::

公告

 

国外有种习惯,比如你访问 www.****.com 网站,他会自动跳转到 ****.com
Community Server 中就提供了这种功能,而且这种功能是可选的(可以强制去掉、强制不去掉、不理睬它)。
默认情况下 Community Server 就强制去掉 www.

先说如何修改是这个功能

打开Web项目,其中的 communityserver.config 配置文件。
在这里我们可以看到下面的配置节:

<CommunityServer>
<Core ......  wwwStatus = "Remove" .... />
......
</CommunityServer>

这里可以有三个设置:
Require  
强制加 www.
Remove  
强制不加 www.  这个是默认设置 
Ignore    
忽略这个问题

只要修改成对应的设置,就自动切换了这个设置。

下面我们看它是如何实现这个功能的:

Community Server 2.0 中使用了 HttpModules 来处理这个功能:web.config中,我们可以看到 httpModules 的配置如下:

    <httpModules>
      <add name="CommunityServer" type="CommunityServer.CSHttpModule, CommunityServer.Components" />
    </httpModules>
..........

CSHttpModule 类在 CommunityServer.Components 项目的HttpModule 目录下的 CSHttpModule.cs 文件中.这个类继承了 System.Web.IHttpModule 接口

System.Web.IHttpModule 接口要求实现 初始化模块方法,即 Init 方法。
在这个类的初始化方法中,我们可以看到,我们订约了BeginRequest 事件。

public void Init(HttpApplication application)
{
 application.BeginRequest += new EventHandler(this.Application_BeginRequest);
 ......
}

在这个事件的处理函数 Application_BeginRequest ,如下,我们可以看到,先从Community Server 配置文件中读取出配置(既从communityserver.config 配置文件读取配置)
然后根据这个配置检查我该如何处理(CheckWWWStatus 函数实现)。

private void Application_BeginRequest(Object source, EventArgs e)
{
 .......
 HttpContext context = application.Context;
 .......
 CSConfiguration config = CSConfiguration.GetConfig();
 .......
 CheckWWWStatus(config,context);
 .......
}

private void CheckWWWStatus(CSConfiguration config, HttpContext context)
{
 if(config.WWWStatus == WWWStatus.Ignore)
  return;
 const string withWWW = "http://www.";
 const string noWWW = "http://";
 string rawUrl = context.Request.Url.ToString().ToLower();
 bool isWWW = rawUrl.StartsWith(withWWW);
 if(config.WWWStatus == WWWStatus.Remove && isWWW)
 {
  context.Response.Redirect(rawUrl.Replace(withWWW, noWWW));
 }
 else if(config.WWWStatus == WWWStatus.Require && !isWWW)
 {
  context.Response.Redirect(rawUrl.Replace(noWWW, withWWW));
 }
}

代码分析到此结束,Community Server 2.0 就是通过上述代码实现定制不同的 www 处理策略的。

 

posted on 2006-06-02 15:46 阿昆 阅读(...) 评论(...) 编辑 收藏