You can do this in an httpmodule
Here's one I wrote that uses a table in a database to match and replace.
It will handle 404 errors as well as being pre-emptive. It will either
do a 301 redirect or RewritePath (based on flag in db)
Table Schema:
OldUrl : varchar(n) - RegEx match or literal (based on field below)
NewUrl : varchar(n) - literal url to redirect to
Redirect301: bit - true if 301 redirect, false if RewritePath
Literal: bit - specifies that the OldUrl is a literal value and not a
pattern match.
I use this in my DotNetNuke sites regularly.
----< code start ---
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Text.RegularExpressions;
using System.Web.Caching;
namespace DNNRedirect
{
public class HttpModule : IHttpModule
{
public HttpModule()
{
//
// TODO: Add constructor logic here
//
}
public void Init(HttpApplication app)
{
app.BeginRequest += new EventHandler(this.OnBeginRequest);
}
public void OnBeginRequest(object s, EventArgs e)
{
HttpApplication app = (HttpApplication)s;
HttpRequest request = app.Request;
HttpResponse response = app.Response;
String requestUrl = request.Url.AbsoluteUri;
String domainPath =
request.Url.AbsoluteUri.Replace(request.Url.PathAn dQuery, "");
String appPath = request.ApplicationPath;
if (appPath.Length 2)
appPath += "/";
appPath = domainPath + appPath;
RedirectorDataSet.dmbcllcRedirectDataTable redirectTable;
redirectTable = RedirectController.GetData();
int rowIndex = 0;
// Handle 404 Errors.
if (request.ServerVariables["QUERY_STRING"].Length 4 &&
request.ServerVariables["QUERY_STRING"].StartsWith("404;"))
{
requestUrl =
request.ServerVariables["QUERY_STRING"].Substring(4).ToLower();
}
// Otherwise, be pre-emptive.
string newURL = null;
bool redirect = false;
for (rowIndex = 0; rowIndex < redirectTable.Rows.Count;
rowIndex++)
{
RedirectorDataSet.dmbcllcRedirectRow row =
(RedirectorDataSet.dmbcllcRedirectRow)(redirectTab le.Rows[rowIndex]);
if (row.Literal)
{
row.OldUrl = row.OldUrl.Replace("~/", appPath);
if (row.OldUrl.ToLower() == requestUrl.ToLower())
{
newURL = row.NewUrl;
redirect = row.Redirect301;
break;
}
}
else
{
row.OldUrl = row.OldUrl.Replace("~/",
Regex.Escape(appPath));
if (Regex.IsMatch(requestUrl, row.OldUrl,
RegexOptions.IgnoreCase))
{
newURL = Regex.Replace(requestUrl, row.OldUrl,
row.NewUrl, RegexOptions.IgnoreCase);
redirect = row.Redirect301;
break;
}
}
}
if (newURL != null)
{
newURL = newURL.Replace("~/", appPath);
if (newURL.ToLower() != requestUrl.ToLower())
{
if (redirect)
{
response.Status = "301 Moved Permanently";
response.AddHeader("Location", newURL);
response.End();
return;
}
else
{
response.ClearContent();
response.StatusCode = 200;
newURL = newURL.Replace(appPath, "~/");
HttpContext.Current.RewritePath(newURL);
}
}
}
}
public void Dispose()
{
}
}
}
----< end ----
-----Original Message-----
From: Eirik Eldorsen [mailto:ei***@increo.no]
Posted At: Monday, November 26, 2007 8:28 AM
Posted To: microsoft.public.dotnet.framework.aspnet
Conversation: How to 301 redirect default.aspx to root
Subject: Re: How to 301 redirect default.aspx to root
Thanks. I was hoping to find a solution without using ISAPI filter, but
I
guess that is the only option, or wait till IIS7 is available.
Eirik
"Juan T. Llibre" <no***********@nowhere.comskrev i melding
news:eP**************@TK2MSFTNGP06.phx.gbl...
You don't have to issue a 301...
Your request sounds like a job for Ionic's ISAPI Rewrite Filter, but
you'll only be able
to use it on a server you control. Shared hosters seldom let you install
ISAPI filters.
IIRF :
http://cheeso.members.winisp.net/IIRF.aspx
It's free.
To remove default.aspx from the URL, you'd use :
RewriteRule (.*)/default.aspx$ $1/ [I,RP]
Juan T. Llibre, asp.net MVP
asp.net faq : http://asp.net.do/faq/
foros de asp.net, en español : http://asp.net.do/foros/
======================================
"Eirik Eldorsen" <ei***@increo.nowrote in message
news:ed*************@TK2MSFTNGP06.phx.gbl...
>Yeah I now how to 301 redirect. The problem is to do it with
default.aspx, without causing an infinite loop. The homepage has 2
url's
>www.eample.com/default.aspx and www.example.com. I want to 301
redirect
>anyone who get default.aspx in the url.
Request.RawUrl returns default.aspx in both cases, so i can't figure
out
>how to check if the user has default.aspx in his url.
"Andrew Brook" <yk****@hotmail.comskrev i melding
news:%2****************@TK2MSFTNGP05.phx.gbl...
>>If i recall correctly, can't you just set this up in IIS, i just
googled
>>"301 redirect" and got
http://www.webconfs.com/how-to-redirect-a-webpage.php as the first
link...
:)
Andrew
"Eirik Eldorsen" <ei***@increo.nowrote in message
news:ef****************@TK2MSFTNGP05.phx.gbl.. .
How can I 301 redirect www.example.com/default.aspx to
www.example.com
>>>without using ISAPI filters?