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

作者:翅膀的初衷 来源:本站原创 发布时间:2014-06-30 查看数:58419

通过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跳转的方法!