国外有种习惯,比如你访问 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 处理策略的。