Kanonische URLs mit ASP.NET

Kanonische URLs bieten zahlreiche Vorteile, insbesondere können sie sich positiv auf die Plazierung in Suchmaschinen auswirken. In ASP.NET kann man ein HTTP-Modul verwenden, um sicherzustellen, daß Anfragen an einen Webserver ggf. auf die kanonische URL umgeleitet werden.

Funktionsumfang

Dieses HTTP-Modul stellt die Kanonizität einer Anfrage durch folgende Überprüfungen sicher:

Kanonischer Hostname

http://www.schneegans.de/ und https://schneegans.de/ sind nicht äquivalent. Es erfolgt eine Umleitung auf den kanonischen Hostnamen. Diese Überprüfung wird durch das canonicalHost-Element in der web.config gesteuert; mit check="true" wird sie aktiviert, der kanonische Hostname wird im hostName-Attribut angegeben:

<canonicalHost check="true" hostName="schneegans.de" />

Kleinschreibung im Pfad

IIS unterscheidet anders als Apache im Pfad einer Anfrage nicht zwischen Groß- und Kleinschreibung. https://schneegans.de/FrontPage/ und https://schneegans.de/frontpage/ sind aber keine äquivalenten URLs. Das Modul sorgt deshalb für eine Umleitung auf einen komplett kleingeschriebenen Pfad. Es ist gegenwärtig nicht möglich, bspw. https://schneegans.de/FrontPage/ oder https://schneegans.de/Frontpage/ als kanonische URL zu definieren.

Diese Überprüfung wird durch das lowerPath-Element aktiviert:

<lowerPath check="true" />

Nur definierte Querystring-Parameter

Die meisten Webserver ignorieren unbekannte Querystring-Parameter völlig. Das ist allerdings ungünstig, denn https://schneegans.de/ und https://schneegans.de/?foo sind für Browser und Proxies zwei völlig verschiedene Ressourcen. Das Modul kann deshalb mit 404 Not Found antworten, wenn eine Anfrage einen unbekannten Parameter enthält.

Diese Überprüfung wird durch das querystring-Element gesteuert. Erlaubte Parameter werden durch ein add-Element hinzugefügt:

<querystring check="true">
  <add key="url" />
  <add key="schema" />
</querystring>

Was nicht geht

Es läßt sich nicht prüfen, ob das Standard-Dokument in einem Verzeichnis über / oder über /Default.aspx angefordert wurde. Diese Prüfung kann unter IIS nur ein ISAPI-Filter vornehmen.

Installation

Laden Sie das kompilierte Modul herunter und entpacken Sie die Dateien im \bin-Verzeichnis Ihrer Web-Applikation. In der web.config können das Modul konfigurieren:

<?xml version="1.0" ?>
<configuration>
  <configSections>
    <section name="canonicalUrl" type="Schneegans.Web.CanonicalUrlSectionHandler,
    CanonicalUrl" allowLocation="true" allowDefinition="Everywhere" />
  </configSections>

  …

  <canonicalUrl>
    <canonicalHost check="true" hostName="localhost" />
    <lowerPath check="true" />
    <querystring check="true" />
  </canonicalUrl> 

  <location path="trace.axd">
    <canonicalUrl>
      <lowerPath check="false" />
      <querystring check="false" />
    </canonicalUrl>
  </location>

  <location path="sv">
    <canonicalUrl>
      <querystring check="true">
        <add key="url" />
        <add key="schema" />
      </querystring>
    </canonicalUrl>
  </location>
  
</configuration>

Ebenso ist eine Konfiguration in Unterverzeichnissen möglich. Die Einstellungen werden dabei vererbt, Querystring-Parameter müssen Sie aber jeweils neu definieren.

Aktiviert wird das Modul wie gewohnt im <httpModules/>-Abschnitt der web.config oder notfalls in der Global.asax.vb:

Private Sub Global_BeginRequest(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles MyBase.BeginRequest

  Dim HttpModule As New Schneegans.Web.CanonicalUrl
  HttpModule.Init(DirectCast(sender, HttpApplication))
  HttpModule.OnBeginRequest(sender, e)

End Sub