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