Weiterleitungen in HTTP
URL-Weiterleitung, auch bekannt als URL-Weiterleitung, ist eine Technik, um einer Seite, einem Formular, einer ganzen Website oder einer Webanwendung mehr als eine URL-Adresse zuzuweisen. HTTP verfügt über eine spezielle Art von Antwort, die als HTTP-Weiterleitung bezeichnet wird und für diese Operation verwendet wird.
Weiterleitungen erfüllen zahlreiche Ziele:
- Temporäre Weiterleitungen während der Wartung oder Ausfallzeiten einer Website
- Permanente Weiterleitungen, um bestehende Links/Lesezeichen zu bewahren, nachdem die URLs der Website geändert wurden, Fortschrittsseiten beim Hochladen einer Datei usw.
Prinzip
In HTTP wird die Weiterleitung durch einen speziellen Weiterleitungs-Antwortcode des Servers ausgelöst. Weiterleitungsantworten haben Statuscodes, die mit 3
beginnen, und einen Location
-Header, der die URL enthält, zu der weitergeleitet werden soll.
Wenn Browser eine Weiterleitung erhalten, laden sie sofort die neue URL, die im Location
-Header angegeben ist. Abgesehen vom kleinen Leistungseinbruch durch einen zusätzlichen Roundtrip bemerken Benutzer die Weiterleitung selten.
Es gibt verschiedene Arten von Weiterleitungen, die in drei Kategorien unterteilt werden:
Permanente Weiterleitungen
Diese Weiterleitungen sind dazu gedacht, für immer zu bestehen. Sie implizieren, dass die ursprüngliche URL nicht mehr verwendet werden sollte und durch die neue ersetzt werden muss. Suchmaschinenroboter, RSS-Leser und andere Crawler werden die ursprüngliche URL für die Ressource aktualisieren.
Code | Text | Methodenverarbeitung | Typischer Anwendungsfall |
---|---|---|---|
301 |
Moved Permanently |
GET -Methoden unverändert. Andere können möglicherweise auf GET geändert werden. [1] |
Umstrukturierung einer Website. |
308 |
Permanent Redirect |
Methode und Körper nicht geändert. | Umstrukturierung einer Website mit Nicht-GET-Links/Operationen. |
[1] Die Spezifikation beabsichtigte nicht, Methodenänderungen zuzulassen, aber es gibt bestehende Benutzeragenten, die ihre Methode ändern. 308
wurde erstellt, um die Zweideutigkeit des Verhaltens bei der Verwendung von Nicht-GET
-Methoden zu entfernen.
Temporäre Weiterleitungen
Manchmal kann die angeforderte Ressource nicht von ihrem kanonischen Ort aus aufgerufen werden, aber sie kann von einem anderen Ort aus aufgerufen werden. In diesem Fall kann eine temporäre Weiterleitung verwendet werden.
Suchmaschinenroboter und andere Crawler speichern die neue, temporäre URL nicht. Temporäre Weiterleitungen werden auch verwendet, wenn Ressourcen erstellt, aktualisiert oder gelöscht werden, um temporäre Fortschrittsseiten anzuzeigen.
Code | Text | Methodenverarbeitung | Typischer Anwendungsfall |
---|---|---|---|
302 |
Found |
GET -Methoden unverändert. Andere können möglicherweise auf GET geändert werden. [2] |
Die Webseite ist vorübergehend aus unvorhergesehenen Gründen nicht verfügbar. |
303 |
See Other |
GET -Methoden unverändert. Andere geändert zu GET (Körper verloren). |
Verwendet zur Umleitung nach einer PUT oder einer POST , damit das Aktualisieren der Ergebnisseite die Operation nicht erneut auslöst. |
307 |
Temporary Redirect |
Methode und Körper nicht geändert. | Die Webseite ist vorübergehend aus unvorhergesehenen Gründen nicht verfügbar. Besser als 302 , wenn Nicht-GET -Operationen auf der Seite verfügbar sind. |
[2] Die Spezifikation beabsichtigte nicht, Methodenänderungen zuzulassen, aber es gibt bestehende Benutzeragenten, die ihre Methode ändern. 307
wurde erstellt, um die Zweideutigkeit des Verhaltens bei der Verwendung von Nicht-GET
-Methoden zu entfernen.
Spezielle Weiterleitungen
304
(Not Modified) leitet eine Seite zur lokal zwischengespeicherten Kopie (die veraltet war) um, und 300
(Multiple Choices) ist eine manuelle Umleitung: Der Körper, als Webseite vom Browser dargestellt, listet die möglichen Weiterleitungen auf, und der Benutzer klickt auf eine, um sie auszuwählen.
Code | Text | Typischer Anwendungsfall |
---|---|---|
300 |
Multiple Choices |
Nicht viele: Die Auswahlmöglichkeiten werden in einer HTML-Seite im Körper aufgelistet. Maschinenlesbare Auswahlmöglichkeiten werden empfohlen, als Link -Header mit rel=alternate gesendet zu werden. |
304 |
Not Modified |
Wird für erneut validierte bedingte Anfragen gesendet. Zeigt an, dass die zwischengespeicherte Antwort noch frisch ist und verwendet werden kann. |
Alternative Methode zur Angabe von Weiterleitungen
HTML-Weiterleitungen
HTTP-Weiterleitungen sind der beste Weg, um Weiterleitungen zu erstellen, aber manchmal haben Sie keine Kontrolle über den Server. In diesem Fall versuchen Sie ein <meta>
-Element mit seinem http-equiv
-Attribut, das im <head>
der Seite auf Refresh
gesetzt ist. Beim Anzeigen der Seite wird der Browser zur angegebenen URL wechseln.
<head>
<meta http-equiv="Refresh" content="0; URL=https://example.com/" />
</head>
Das content
-Attribut sollte mit einer Zahl beginnen, die angibt, wie viele Sekunden der Browser warten soll, bevor zur angegebenen URL weitergeleitet wird. Stellen Sie es immer auf 0
ein, um die Barrierefreiheit zu gewährleisten.
Offensichtlich funktioniert diese Methode nur mit HTML und kann nicht für Bilder oder andere Arten von Inhalten verwendet werden.
JavaScript-Weiterleitungen
Weiterleitungen in JavaScript werden durchgeführt, indem eine URL-Zeichenkette der window.location
-Eigenschaft zugewiesen wird, wodurch die neue Seite geladen wird:
window.location = "https://example.com/";
Wie HTML-Weiterleitungen können auch diese nicht auf alle Ressourcen angewendet werden, und offensichtlich wird dies nur auf Clients funktionieren, die JavaScript ausführen. Andererseits gibt es mehr Möglichkeiten: Zum Beispiel können Sie die Weiterleitung nur auslösen, wenn bestimmte Bedingungen erfüllt sind.
Reihenfolge der Präzedenz
Mit drei Möglichkeiten, Weiterleitungen auszulösen, können zeitgleich mehrere Methoden verwendet werden. Aber welche wird zuerst angewendet?
- HTTP-Weiterleitungen werden immer zuerst ausgeführt — sie existieren, wenn noch keine Seite übertragen wurde.
- Etwas überraschend kommen dann JavaScript-Weiterleitungen vor HTML-Weiterleitungen. Dies liegt daran, dass die
<meta>
-Weiterleitung nach dem vollständigen Laden der Seite auftritt, was nach dem Ausführen aller Skripte ist. - HTML-Weiterleitungen (
<meta>
) werden ausgeführt, wenn keine vorherigen HTTP-Weiterleitungen oder JavaScript-Weiterleitungen ausgeführt wurden, bevor die Seite geladen wurde. - Wenn es JavaScript-Weiterleitungen gibt, die nach dem Laden der Seite ausgeführt werden (z. B. bei einem Klick auf einen Button), wird sie zuletzt ausgeführt, wenn die Seite nicht bereits durch die vorherigen Methoden weitergeleitet wurde.
Wenn möglich, verwenden Sie HTTP-Weiterleitungen und fügen Sie keine <meta>
-Element-Weiterleitungen hinzu. Wenn jemand die HTTP-Weiterleitungen ändert, aber vergisst, die HTML-Weiterleitungen zu ändern, werden die Weiterleitungen nicht mehr identisch sein, was zu einer Endlosschleife oder anderen Problemen führen könnte.
Anwendungsfälle
Es gibt zahlreiche Anwendungsfälle für Weiterleitungen, aber da bei jeder Weiterleitung die Leistung beeinträchtigt wird, sollte ihr Einsatz auf ein Minimum beschränkt werden.
Domain-Aliasing
Idealerweise gibt es einen Ort und daher eine URL für jede Ressource. Aber es gibt Gründe für alternative Namen für eine Ressource:
- Erweiterung der Reichweite Ihrer Website
-
Ein häufiger Fall ist, wenn eine Website unter
www.example.com
residiert, aber auch der Zugriff vonexample.com
funktionieren soll. Weiterleitungen vonexample.com
zuwww.example.com
werden daher eingerichtet. Sie können auch von gängigen Synonymen oder häufigen Tippfehlern Ihrer Domains umleiten. - Umzug auf eine neue Domain
-
Zum Beispiel wurde Ihr Unternehmen umbenannt, aber Sie möchten, dass bestehende Links oder Lesezeichen Sie unter dem neuen Namen noch finden.
- Erzwingen von HTTPS
-
Anfragen an die
http://
-Version Ihrer Website werden zurhttps://
-Version Ihrer Website weitergeleitet.
Links am Leben erhalten
Wenn Sie Websites umstrukturieren, ändern sich die URLs. Selbst wenn Sie die Links Ihrer Website aktualisieren, um die neuen URLs anzupassen, haben Sie keine Kontrolle über die von externen Ressourcen verwendeten URLs.
Sie möchten diese Links nicht brechen, da sie wertvolle Nutzer bringen und Ihre SEO verbessern, also richten Sie Weiterleitungen von den alten URLs zu den neuen ein.
Hinweis: Diese Technik funktioniert auch für interne Links, aber versuchen Sie, interne Weiterleitungen zu vermeiden. Eine Weiterleitung hat erhebliche Leistungskosten (da eine zusätzliche HTTP-Anfrage erfolgt). Wenn Sie es vermeiden können, indem Sie interne Links korrigieren, sollten Sie diese Links stattdessen reparieren.
Temporäre Antworten auf unsichere Anfragen
Unsichere Anfragen ändern den Zustand des Servers, und der Benutzer sollte sie nicht unbeabsichtigt erneut senden.
Typischerweise möchten Sie nicht, dass Ihre Benutzer PUT
, POST
oder DELETE
-Anfragen erneut senden. Wenn Sie die Antwort als Ergebnis dieser Anfrage bereitstellen, wird durch einfaches Drücken der Aktualisierungstaste die Anfrage erneut gesendet (möglicherweise nach einer Bestätigungsmeldung).
In diesem Fall kann der Server eine 303
(See Other)-Antwort für eine URL senden, die die richtigen Informationen enthält. Wenn die Aktualisierungstaste gedrückt wird, wird nur diese Seite erneut angezeigt, ohne dass die unsicheren Anfragen wiederholt werden.
Temporäre Antworten auf lange Anfragen
Einige Anfragen benötigen möglicherweise mehr Zeit auf dem Server, wie DELETE
-Anfragen, die zur späteren Bearbeitung geplant sind. In diesem Fall ist die Antwort eine 303
(See Other)-Weiterleitung, die auf eine Seite verweist, die angibt, dass die Aktion geplant wurde, und schließlich über ihren Fortschritt informiert oder es ermöglicht, sie abzubrechen.
Konfigurieren von Weiterleitungen in gängigen Servern
Apache
Weiterleitungen können entweder in der Serverkonfigurationsdatei oder in der .htaccess
jeder Verzeichnisse eingerichtet werden.
Das mod_alias
-Modul verfügt über Redirect
- und RedirectMatch
-Direktiven, die standardmäßig 302
-Weiterleitungen einrichten:
<VirtualHost *:443>
ServerName example.com
Redirect / https://www.example.com
</VirtualHost>
Die URL https://example.com/
wird zu https://www.example.com/
weitergeleitet, ebenso wie alle Dateien oder Verzeichnisse darunter (https://example.com/some-page
wird zu https://www.example.com/some-page
weitergeleitet).
RedirectMatch
macht dasselbe, übernimmt jedoch einen regulären Ausdruck, um eine Sammlung betroffener URLs zu definieren:
RedirectMatch ^/images/(.*)$ https://images.example.com/$1
Alle Dokumente im images/
-Verzeichnis werden zu einer anderen Domain weitergeleitet.
Wenn Sie keine temporäre Weiterleitung wünschen, kann ein zusätzlicher Parameter (entweder der zu verwendende HTTP-Statuscode oder das Schlüsselwort permanent
) verwendet werden, um eine andere Weiterleitung einzurichten:
Redirect permanent / https://www.example.com
# …acts the same as:
Redirect 301 / https://www.example.com
Das mod_rewrite
-Modul kann ebenfalls Weiterleitungen erstellen. Es ist flexibler, aber etwas komplexer.
Nginx
In Nginx erstellen Sie einen spezifischen Serverblock für die Inhalte, die Sie weiterleiten möchten:
server {
listen 80;
server_name example.com;
return 301 $scheme://www.example.com$request_uri;
}
Um eine Weiterleitung auf ein Verzeichnis oder nur bestimmte Seiten anzuwenden, verwenden Sie die rewrite
-Direktive:
rewrite ^/images/(.*)$ https://images.example.com/$1 redirect;
rewrite ^/images/(.*)$ https://images.example.com/$1 permanent;
IIS
In IIS verwenden Sie das <httpRedirect>
-Element, um Weiterleitungen zu konfigurieren.
Weiterleitungsschleifen
Weiterleitungsschleifen treten auf, wenn zusätzliche Weiterleitungen derjenigen folgen, die bereits berücksichtigt wurde. Mit anderen Worten, es gibt eine Schleife, die niemals beendet wird, und keine Seite wird jemals gefunden.
Meistens ist dies ein Serverproblem, und wenn der Server es erkennen kann, wird er eine 500
Internal Server Error
zurücksenden. Wenn Sie kurz nach der Änderung einer Serverkonfiguration auf einen solchen Fehler stoßen, ist dies wahrscheinlich eine Weiterleitungsschleife.
Manchmal wird der Server es nicht erkennen: Eine Weiterleitungsschleife kann über mehrere Server verteilt sein, die jeweils nicht das vollständige Bild haben. In diesem Fall erkennen Browser es und zeigen eine Fehlermeldung an. Firefox zeigt an:
Firefox hat erkannt, dass der Server die Anfrage für diese Adresse auf eine Weise umleitet, die nie beendet wird.
...während Chrome anzeigt:
Diese Webseite hat eine Umleitungsschleife
In beiden Fällen kann der Benutzer nicht viel tun (es sei denn, es tritt auf seiner Seite eine Korruption auf, wie eine Diskrepanz der Cache- oder Cookie-Daten).
Es ist wichtig, Weiterleitungsschleifen zu vermeiden, da sie die Benutzererfahrung vollständig zerstören.