asp.net程序级实现非指定域名301重定向

翅膀的初衷

发表于2014-06-30 22:19:25

通过IIS7的URL Rewrite Module组件,我们可以轻松配置301永久重定向,但是如果我们的IIS版本是6.0或者没有安装相关组件且无法进行环境配置(一般多为虚拟主机)的情况下,怎么办?

对于Asp.net来讲,这是一个很简单的问题,即然我们可以轻松在程序级实现URL 重写,那么同样,实现程序级301重写向也是相当轻松的,甚至我们可以自己写个简单的处理程序,来让我们的asp.net兼容.htaccess!

那么,我们如何实现该功能点?

在这里,我们需要利用HttpModule通道,首先,新建一个项目,命名叫:Jiniannet(命名可以自定义,只是注意相关的命名空间替换成自己的就行了)。

然后添加-新建项:HttpModule.cs

代码如下:

using System; using System.Collections.Generic; using System.Text; using System.Web; using System.Collections; using System.Reflection; using System.Globalization; namespace Jiniannet { public class HttpModule : System.Web.IHttpModule { public void Init(HttpApplication application) { application.BeginRequest += new EventHandler(this.BeginRequest); } private void BeginRequest(Object sender, EventArgs e) { HttpApplication app = sender as HttpApplication; HttpRequest request = app.Context.Request; string url = request.Url; var host = "www.jiniannet.com";//主域名 凡是所有域名不等于这个的,都会301到这个域名上 if (!url.Host.Equals(host, StringComparison.OrdinalIgnoreCase)) { string redirectUrl = string.Concat(request.IsSecureConnection ? "https://" : "http://", host, url.AbsolutePath, url.PathAndQuery ); app.Context.Response.Clear(); app.Context.Response.AddHeader("Location", redirectUrl); app.Context.Response.StatusCode = 301; } } #region IHttpModule 成员 public void Dispose() { } #endregion } }

其中,最核心的代码是这一段:

if (!url.Host.Equals(host, StringComparison.OrdinalIgnoreCase)) { string redirectUrl = string.Concat(request.IsSecureConnection ? "https://" : "http://", host, url.AbsolutePath, url.PathAndQuery ); app.Context.Response.Clear(); app.Context.Response.AddHeader("Location", redirectUrl); app.Context.Response.StatusCode = 301; }

直接判断当前访问的域名是不是www.jiniannet.com,不是,就输出HttpStatus为301,并增加Location(跳转地址)属性!

然后在Web.config的system.web中添加如下配置即可!

<httpModules> <add name="HttpModule" type="Jiniannet.HttpModule,Jiniannet" /> </httpModules>

按F5,运行,试试访问非指定域名是不是进行了301跳转!

注:Response.Redirect 是302跳转,另外.NET 4.0中好像带了301跳转的方法!