I did this with an HttpModule:
namespace MySite.Classes
{
public class SeoModule : IHttpModule
{
// As this is defined in DEV and Production, I store the host domain in
// the web.config: <add key="HostDomain" value="www.example.com" />
private readonly string m_Domain =
WebConfigurationManager.AppSettings["HostDomain"];
#region IHttpModule Members
public void Dispose()
{
//clean-up code here.
}
public void Init(HttpApplication context)
{
// We want this fire as every request starts.
context.BeginRequest += OnBeginRequest;
}
#endregion
private void OnBeginRequest(object source, EventArgs e)
{
var application = (HttpApplication) source;
HttpContext context = application.Context;
string host = context.Request.Url.Host;
if (!string.IsNullOrEmpty(m_Domain))
{
if (host != m_Domain)
{
// This will honour ports, SSL, querystrings, etc
string newUrl =
context.Request.Url.AbsoluteUri.Replace(host, m_Domain);
// We would prefer a permanent redirect, so need to generate
// the headers ourselves. Note that ASP.NET 4.0 will introduce
// Response.PermanentRedirect
context.Response.StatusCode = 301;
context.Response.StatusDescription = "Moved Permanently";
context.Response.RedirectLocation = newUrl;
context.Response.End();
}
}
}
}
}
Then we need to add the module to our Web.Config:
Find the section <httpModules>
in the <system.web>
section, it may well have a couple of other entries in there already, and add something like:
<add name="SeoModule" type="MySite.Classes.SeoModule, MySite" />
You can see this in action here:
All end up on http://www.doodle.co.uk
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…