Wenn man eine Webseite oder Teile einer Webseite permanent umziehen möchte, sollte man den Clients mitteilen, wo sie die Inhalte jetzt finden können. Der beste Weg dazu ist, mit einem HTTP Status Code 301 Moved Permanently zu antworten. In der Antwort wird die neue Adresse mitgeliefert.
Im Browser ändert sich dadurch beispielsweise automatisch die angezeigte Adresse und auch die Suchmaschinen wissen, dass der Inhalt umgezogen ist. In SEO Kreisen wird diese Form der Weiterleitung als die einzige akzeptable Möglichkeit gewertet.
Ich wollte mein ASP.NET basiertes Blog umziehen, also lag es nahe, auch die Weiterleitung mit ASP.NET zu realisieren. Um alle ASP.NET Antworten auf einen Schlag zu erwischen, empfiehlt sich ein HttpHandler. Damit können zentral alle Requests behandelt werden, bevor weitere Verarbeitungen in der Engine stattfinden.
Es genügt einen minimale Web Applikation anzulegen. In App_Code kommt eine von IHttpHandler abgeleitete Klasse Redirector:
using System;
using System.Web;
public class Redirector : IHttpModule
{
public void Dispose() { }
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
const string OldPath = "http://www.cptec.de/blogit";
const string NewPath = "http://www.deger-it.de";
void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication application = sender as HttpApplication;
string absoluteUri = application.Context.Request.Url.AbsoluteUri;
if (absoluteUri.ToLower().StartsWith(OldPath))
{
application.Context.Response.StatusCode = 301;
application.Context.Response.StatusDescription = "Moved Permanently";
string oldRequest = absoluteUri.Substring(OldPath.Length);
application.Context.Response.RedirectLocation = NewPath + oldRequest;
application.Context.Response.End();
}
}
}
Bei allen Requests, die auf die alte Adresse des Blogs zugreifen wollen, wird mit einer einfachen String Bearbeitung die neue Adresse ausgerechnet. Der Status Code 301 samt Beschreibung und neuer Adresse wird gesetzt und als Antwort zurückgeschickt.
Damit dieser HttpHandler auch aktive ist, muss er noch in der Web.Config eingetragen werden:
<system.web>
<httpModules>
<add name="Redirection" type="Redirector"/>
</httpModules>
</system.web>
Jeder ASP.NET Zugriff wird jetzt sauber an die neue Adresse weitergeleitet. Alle Zugriffe auf Ressourcen, die nicht über ASP.NET ausgeliefert werden, sind davon aber nicht betroffen. Bei diesem Blog werden die Bilder beispielsweise statisch über den Webserver ausgeliefert. Davon kriegt der HttpHandler gar nichts mit.
Handler Mapping IIS6
Beim IIS6 kann man das über den IIS Manager konfigurieren. Bei der entsprechenden Webseite oder dem Virtual Directory in der Application Configuration unter Mappings kann man die ASP.NET Engine auf weitere Dateien anwenden.
Dazu klickt man Add und trägt bei Executable den ASP.NET ISAPI Filter ein. Der Pfad wird ungefähr so aussehen:
c:\Windows\Microsft.NET\Framework\2.0.xxx\aspnet_isapi.dll
Bei Extension gibt man die gewünschte Dateiendung ein. Beispielsweise .jpg für JPEG Bilder.
Jetzt fühlt sich ASP.NET auch für JPEG Dateien zuständig und der neue HttpHandler wird durchlaufen und leitet entsprechend weiter.
Handler Mapping IIS7
Leider ist das bei einigen Dateitypen relativ mühselig. Mit dem IIS7 kann man das komplett über die Web.Config einstellen:
<system.webServer>
<handlers>
<add name="Redirector" path="*.jpg" verb="GET" type="Redirector" resourceType="File" />
</handlers>
</system.webServer>
Wie ich leider zu spät erfahren habe, kann man auch direkt mit den Bordwerkzeugen von IIS6 sehr flexibel Weiterleitungen konfigurieren: Redirect Reference
Wenn man aber wie bei einem Web-Hoster nicht zugriff auf die kompletten Admin-Werkzeuge hat, ist die vorgestellte Variante immer noch möglich. Außerdem ist ein HttpHandler wesentlich flexibler.