Zum Inhalt springen

Weiterleitungen mit Microsoft IIS

IIS bietet dir zwei Wege für Weiterleitungen: die eingebaute HTTP-Umleitung und das URL-Rewrite-Modul. Hier erfährst du, wann du welches nimmst – mit web.config-Beispielen zum Kopieren.

HTTP-Umleitung oder URL Rewrite?

Die Internet Information Services kennen zwei voneinander unabhängige Mechanismen für Weiterleitungen. Beide richtest du im IIS-Manager oder direkt in der web.config der Website ein:

HTTP-UmleitungURL-Rewrite-Modul
InstallationWindows-Feature „HTTP-Umleitung“Separater Download (URL Rewrite 2.1)
Konfigurationselement<httpRedirect><rewrite>
Bedingungen (Host, HTTPS, Query-String)NeinJa
Reguläre AusdrückeNeinJa
Geeignet fürUmzug einer ganzen Site oder eines Ordners, einzelne SeitenHTTPS, www, Muster, lange Redirect-Listen

Als Faustregel gilt: Für „alles von hier geht dorthin“ reicht die HTTP-Umleitung. Sobald eine Bedingung ins Spiel kommt – und bei HTTP auf HTTPS ist das immer der Fall –, brauchst du URL Rewrite. Setz nicht beide für dieselben URLs ein, sonst entstehen Ketten.

Die HTTP-Umleitung

Installation

Unter Windows Server fügst du im Server-Manager die Rolle Webserver (IIS) → Webserver → Allgemeine HTTP-Features → HTTP-Umleitung hinzu. Per PowerShell geht es so:

Install-WindowsFeature Web-Http-Redirect

Unter Windows 10/11 findest du das Feature unter „Windows-Features aktivieren oder deaktivieren“ → Internetinformationsdienste → WWW-Dienste → Allgemeine HTTP-Features.

Ganze Website weiterleiten

Wähl im IIS-Manager die Website aus, öffne HTTP-Umleitung, setz den Haken bei „Anforderungen an dieses Ziel umleiten“, trag das Ziel ein und wähl den Statuscode. In der web.config sieht das so aus:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <httpRedirect enabled="true"
                  destination="https://example.com$V$Q"
                  exactDestination="true"
                  httpResponseStatus="Permanent" />
  </system.webServer>
</configuration>

Mit exactDestination="true" nimmt IIS das Ziel wörtlich und ersetzt nur die Variablen: $V steht für den angefragten Pfad, $Q für den Query-String samt Fragezeichen. Aus /shop/artikel?id=5 wird so https://example.com/shop/artikel?id=5. Genau das brauchst du beim Domain-Umzug, wenn die alte Domain eine eigene IIS-Site hat.

Die möglichen Werte für httpResponseStatus:

  • Permanent: 301
  • Found: 302 (Standardwert – deshalb immer explizit setzen)
  • Temporary: 307
  • PermRedirect: 308, in neueren IIS-Versionen verfügbar

Einzelne Seite weiterleiten

Dafür packst du die Einstellung in ein <location>-Element direkt unter <configuration>:

<location path="alte-seite.aspx">
  <system.webServer>
    <httpRedirect enabled="true"
                  destination="https://example.com/neue-seite/"
                  exactDestination="true"
                  httpResponseStatus="Permanent" />
  </system.webServer>
</location>

Die Vererbungsfalle

Einstellungen der HTTP-Umleitung gelten auch für alle Unterordner. Leitest du das Root einer Site auf /neu/ derselben Site um, erbt /neu/ die Umleitung – und du hast eine Endlosschleife. Abhilfe: Aktivier „Nur Anforderungen an Inhalte in diesem Verzeichnis umleiten“ (childOnly="true"), setz im Zielordner <httpRedirect enabled="false" /> oder nimm URL Rewrite mit einem präzisen Muster.

Das URL-Rewrite-Modul

URL Rewrite ist eine offizielle, kostenlose Erweiterung von Microsoft, die du auf jedem Server separat herunterladen und installieren musst. Fehlt sie, führt jeder <rewrite>-Abschnitt in der web.config zu einem HTTP-Fehler 500.19, weil IIS den Konfigurationsabschnitt nicht kennt. Bei Azure App Service unter Windows ist das Modul bereits dabei. Die komplette Syntax findest du in der Konfigurationsreferenz von URL Rewrite.

Die Regeln stehen unter <system.webServer><rewrite><rules>. Drei Dinge solltest du wissen:

  • <match url="..."> wird gegen den Pfad ohne führenden Slash und ohne Query-String geprüft, standardmäßig ohne Beachtung der Groß- und Kleinschreibung.
  • redirectType kann Permanent (301), Found (302, Standard), SeeOther (303) oder Temporary (307) sein.
  • stopProcessing="true" beendet die Regelverarbeitung nach einem Treffer. Bei Weiterleitungsregeln solltest du es immer setzen.

Einzelne Seite

<rule name="Alte Seite" stopProcessing="true">
  <match url="^alte-seite\.aspx$" />
  <action type="Redirect" url="https://example.com/neue-seite/" redirectType="Permanent" />
</rule>

Muster mit Rückverweis

<rule name="Blog zu Artikel" stopProcessing="true">
  <match url="^blog/\d{4}/(.+)$" />
  <action type="Redirect" url="https://example.com/artikel/{R:1}" redirectType="Permanent" />
</rule>

{R:1} verweist auf die erste Klammergruppe aus dem Match, {C:1} auf eine Gruppe aus einer Bedingung. Den Query-String hängt URL Rewrite automatisch an; mit appendQueryString="false" an der Action lässt du ihn weg.

HTTP auf HTTPS

Die komplette web.config für eine Site, die nur noch per HTTPS erreichbar sein soll:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="HTTP zu HTTPS" stopProcessing="true">
          <match url="(.*)" />
          <conditions>
            <add input="{HTTPS}" pattern="^OFF$" />
          </conditions>
          <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

Die Site braucht eine HTTPS-Bindung mit gültigem Zertifikat, und die HTTP-Bindung auf Port 80 muss bestehen bleiben – sonst kommt die Anfrage gar nicht erst bei der Regel an. Hinter einem Load Balancer oder Application Request Routing, das TLS terminiert, ist {HTTPS} immer OFF. Prüf dann den weitergereichten Header: <add input="{HTTP_X_FORWARDED_PROTO}" pattern="^https$" negate="true" />. Mehr dazu im Ratgeber HTTP auf HTTPS weiterleiten.

HTTPS und ohne www in einem Hop

Mit zwei getrennten Regeln läuft http://www.example.com/ durch zwei Weiterleitungen. Kombinier sie mit logicalGrouping="MatchAny":

<rule name="Kanonischer Host und HTTPS" stopProcessing="true">
  <match url="(.*)" />
  <conditions logicalGrouping="MatchAny">
    <add input="{HTTPS}" pattern="^OFF$" />
    <add input="{HTTP_HOST}" pattern="^www\." />
  </conditions>
  <action type="Redirect" url="https://example.com/{R:1}" redirectType="Permanent" />
</rule>

Setz diese Regel an den Anfang – oder gib den seitenbezogenen Regeln absolute Ziele mit https://example.com, damit jede URL mit einem Hop auskommt. Ob du dich für www oder ohne entscheidest, erklärt der Ratgeber zur www-Weiterleitung.

Viele Weiterleitungen mit einer Rewrite Map

Bei langen Listen alter und neuer URLs ist eine Rewrite Map deutlich pflegeleichter als eine Regel pro URL:

<rewrite>
  <rewriteMaps>
    <rewriteMap name="Redirects">
      <add key="/alte-seite.aspx" value="/neue-seite/" />
      <add key="/produkte/liste.aspx?kat=5" value="/shop/schuhe/" />
    </rewriteMap>
  </rewriteMaps>
  <rules>
    <rule name="Redirect Map" stopProcessing="true">
      <match url=".*" />
      <conditions>
        <add input="{Redirects:{REQUEST_URI}}" pattern="(.+)" />
      </conditions>
      <action type="Redirect" url="{C:1}" appendQueryString="false" redirectType="Permanent" />
    </rule>
  </rules>
</rewrite>

{REQUEST_URI} enthält den Query-String, die Schlüssel können also auch auf bestimmte Parameter passen. Sehr große Maps lagerst du mit <rewriteMaps configSource="rewritemaps.config" /> in eine eigene Datei aus.

Testen

Im IIS-Manager bringt URL Rewrite fertige Vorlagen mit (kanonischer Domänenname, Schrägstrich am Ende anhängen oder entfernen, URLs in Kleinbuchstaben erzwingen) sowie einen Dialog „Muster testen“ für deinen Regex. Der prüft allerdings nur das Muster, nicht die Antwort des Servers. Das echte Ergebnis siehst du, wenn du die alte URL in den Redirect-Checker eingibst: Statuscode, Ziel und Anzahl der Hops, ganz ohne Browser-Cache. Teste HTTP und HTTPS, mit und ohne www sowie URLs mit Query-String. Greift eine Weiterleitung gar nicht, zeigt dir die Ablaufverfolgung für Anforderungsfehler (Failed Request Tracing), welche Regeln ausgewertet wurden. Lange Ketten nach einem Umzug behandelt der Artikel über Redirect-Ketten.

Häufige Fragen

Warum bekomme ich nach dem Einfügen der Regeln den Fehler 500.19?

Deine web.config enthält einen <rewrite>-Abschnitt, aber auf dem Server ist das URL-Rewrite-Modul nicht installiert – IIS kennt den Abschnitt also nicht. Installier URL Rewrite oder entfern den Abschnitt. Ein Tippfehler im XML führt übrigens zum selben Fehler.

Behält die IIS-HTTP-Umleitung Pfad und Query-String?

Nur, wenn du es ihr sagst. Zuverlässig klappt es mit exactDestination="true" und $V$Q am Ende des Ziels, also etwa https://example.com$V$Q. Kontrollier das Ergebnis mit dem Redirect-Checker.

Welchen Statuscode sendet IIS standardmäßig?

Sowohl HTTP-Umleitung als auch URL Rewrite senden standardmäßig einen 302 (Found). Für dauerhafte Umzüge setzt du httpResponseStatus="Permanent" bzw. redirectType="Permanent" explizit, dann kommt ein 301. Warum das wichtig ist, erklärt 301 vs. 302.

Kann ich unter IIS eine .htaccess verwenden?

Nein, IIS arbeitet mit der web.config. URL Rewrite kann im IIS-Manager aber mod_rewrite-Regeln importieren („Regeln importieren“). Prüf das Ergebnis trotzdem, denn nicht jedes Apache-Flag hat eine Entsprechung.

  • .htaccess-Weiterleitung auf Apache

    So leitest du einzelne Seiten und ganze Domains per .htaccess weiter: mod_alias oder mod_rewrite, fertige Regeln für die typischen Fälle und wie du Schleifen und Ketten vermeidest.

  • Weiterleitungen mit nginx

    Fertige nginx-Konfiguration für 301-Weiterleitungen: einzelne Seiten, Muster, ganze Domains, HTTPS und www in einem Hop und Hunderte URLs per map.

  • Weiterleitungen mit Cloudflare

    Cloudflare kann Weiterleitungen direkt am Edge beantworten, bevor eine Anfrage deinen Server erreicht. So funktionieren Single Redirects, Bulk Redirects und Always Use HTTPS – und so verhinderst du, dass sie sich mit deinem Server in die Quere kommen.

  • Weiterleitungen in WordPress

    In WordPress kannst du URLs auf mehreren Wegen weiterleiten: per Plugin, per Regel in der .htaccess oder mit ein paar Zeilen PHP. Hier erfährst du, welcher Weg wann passt und wie du die typischen Stolperfallen mit Caching und HTTPS umgehst.

  • Weiterleitungen in Next.js

    In Next.js kannst du an vier Stellen weiterleiten: in der Konfiguration, in der Middleware, im Servercode des App Routers und über die Option trailingSlash. Jede davon sendet standardmäßig andere Statuscodes – es lohnt sich also, die Unterschiede zu kennen.

  • Weiterleitungen bei Vercel und Netlify

    Bei Vercel und Netlify fasst du keine Webserver-Konfiguration an. Weiterleitungen stehen in einer Datei in deinem Repository oder im Dashboard, und das Edge-Netzwerk der Plattform liefert sie aus. So funktionieren beide – und hier unterscheiden sie sich.