====== Weiterleitungen / Redirects ====== Eine Übersicht über Möglichkeiten für Weiterleitungen, die über die klassischen 301 und 302 Status-Codes hinausgeht (zumindest ein bisschen). ===== Weiterleitung mit HTTP Status-Codes ===== ^ Status ^ Nachricht ^ Spezifikation ^^ Dauer ^ Cachability ^ Methodenänderung ^ ^ ::: ^ ::: ^ Erste ^ Aktuelle [(https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml)] ^ ::: ^ ::: ^ ::: ^ | 301 | Moved Permanently | [[https://www.greenbytes.de/tech/webdav/rfc1945.html#rfc.section.9.3|RFC 1945]] (1996) | [[https://www.greenbytes.de/tech/webdav/rfc7231.html#rfc.section.6.4.2|RFC 7231]] (2014) | Permanent | (V)\\ (by default) | //Möglich// (üblich [(:rfc7231-6.4.p.3.1)]):\\ POST -> GET | | 302 | Found \\ (v1.0: "Moved temporarily") | [[https://www.greenbytes.de/tech/webdav/rfc1945.html#rfc.section.9.3|RFC 1945]] (1996) | [[https://www.greenbytes.de/tech/webdav/rfc7231.html#rfc.section.6.4.3|RFC 7231]] (2014) | Zeitweise | (V)\\ (not by default) | //Möglich// (üblich [(:rfc7231-6.4.p.3.1)]):\\ POST -> GET | | 303 | See Other | [[https://www.greenbytes.de/tech/webdav/rfc2616.html#rfc.section.10.3.4|RFC 2616]] (1999)\\ [[https://tools.ietf.org/html/rfc2068#section-10.3.4|RFC 2068]] (1997) | [[https://www.greenbytes.de/tech/webdav/rfc7231.html#rfc.section.6.4.4|RFC 7231]] (2014) | Zeitweise | (V)\\ (not by default) | //Verpflichtend//:\\ * -> GET oder HEAD | | 307 | Temporary Redirect | [[https://www.greenbytes.de/tech/webdav/rfc2616.html#rfc.section.10.3.8|RFC 2616]] (1999) | [[https://www.greenbytes.de/tech/webdav/rfc7231.html#rfc.section.6.4.7|RFC 7231]] (2014) | Zeitweise | (V)\\ (not by default) | -- | | 308 | Permanent Redirect | [[https://www.greenbytes.de/tech/webdav/rfc7238.html|RFC 7238]] (2014) | [[https://www.greenbytes.de/tech/webdav/rfc7538.html|RFC 7538]] (2015) | Permanent | (V)\\ (by default) | -- | [(rfc7231-6.4.p.3.1>[[https://www.greenbytes.de/tech/webdav/rfc7231.html#rfc.section.6.4.p.3.1]].)] **Nicht vergessen**: * Einen //kleinen// Body mit einem Link zur Weiterleitung mit zu schicken. * Immer ''Cache-Control'' mitschicken. * In dem Body könnte ein ''%%%%'' als fallback verwendet werden [(https://www.greenbytes.de/tech/webdav/rfc7538.html#rfc.section.4)], aber auch wenn der RFC das vorschlägt ist die Methode lange deprecated. * Der Link im Body sowie das Meta-Tag können als fallback dienen, wenn der Status-Code recht neu ist. ==== Änderung der Speicherbarkeit 2014 ==== Seit [[https://www.greenbytes.de/tech/webdav/rfc7231.html|RFC 7231]] (2014) ist die Speicherbarkeit von Status-Code 302, 303 und 307 nicht mehr explizit definiert. Die Antworten sind daher alle speicherbar, aber nicht standardmäßig [([[https://www.greenbytes.de/tech/webdav/rfc7231.html#rfc.section.6.1.p.2]])]. ^ Status-Code ^ Speicherbarkeit ^^ ^ ::: ^ Vorher ^ Nachher ^ | 302 | (V) (not by default) [(https://www.greenbytes.de/tech/webdav/rfc2616.html#rfc.section.10.3.3.p.1)] | (V) (not by default) [([[https://www.greenbytes.de/tech/webdav/rfc7231.html#rfc.section.6.4.3]])] | | 303 | (X) [([[https://www.greenbytes.de/tech/webdav/rfc2616.html#rfc.section.10.3.4.p.1]])] | (V) (not by default) [([[https://www.greenbytes.de/tech/webdav/rfc7231.html#rfc.section.6.4.4]])] | | 307 | (V) (not by default) [([[https://www.greenbytes.de/tech/webdav/rfc2616.html#rfc.section.10.3.8.p.1]])] | (V) (not by default) [([[https://www.greenbytes.de/tech/webdav/rfc7231.html#rfc.section.6.4.7]])] | Es ist daher Ratsam immer ''Cache-Control'' mitschicken. [[https://support.cloudflare.com/hc/en-us/articles/200168326-Are-301-and-302-redirects-cached-by-CloudFlare-|Cloudflare speichert]] zum Beispiel auch 302 für ca. 20 Minuten. ==== Weiteres aus dem 3xx Block ==== * **300 (Multiple Choices)**: Mehrere Versionen des Dokuments sind unter genaueren URIs erreichbar. Die vom Server bevorzugte Version steht im ''Location'' Header. Alle Versionen stehen im Body (Browser dürfte, wenn er den Body verstünde, passende Version selber auswählen). [([[https://www.greenbytes.de/tech/webdav/rfc7231.html#rfc.section.6.4.1]])] * **304 (Not Modified)**: Wer kennt ihn nicht? Ansonsten [[https://www.greenbytes.de/tech/webdav/rfc7232.html#rfc.section.4.1|RFC 7232]] lesen :) * **305 (Use Proxy)**: Deprecated [([[https://www.greenbytes.de/tech/webdav/rfc7231.html#rfc.section.6.4.5.p.1]])] * **306**: Der Status-Code ist reserviert und war mal als "Switch Proxy" angedacht [([[https://tools.ietf.org/html/draft-cohen-http-305-306-responses-00]])] ==== Weitere Infos ==== * [[https://audisto.com/insights/guides/31/|Lange Abhandlung über Weiterleitungen]] * [[http://stevesouders.com/tests/redirects/index.php|Online tool zum testen von Weiterleitungen]] ===== Weiterleitungen mit JavaScript ===== ==== Mit neuem Eintrag in der History ==== Die folgenden drei Statements haben die identische Funktion [([[https://developer.mozilla.org/en-US/docs/Web/API/Window/location#Example_.231.3A_Navigate_to_a_new_page]])]. Sie leiten den Benutzer weiter und erzeugen dabei einen weiteren Eintrag in der Histroy. Wenn man von Seite A auf Seite B geht, wo dann die Weiterleitung auf Seite C stattfindet, dann landet der Benutzer mit dem Zurück-Button wieder auf Seite B. location = "http://www.example.com/"; location.href = "http://www.example.com/"; location.assign("http://www.example.com/"); ==== Mit ersetztem Eintrag in der History ==== Ersetzt den aktuellen Eintrag in der History. Wenn man von Seite A auf Seite B geht, wo dann die Weiterleitung auf Seite C stattfindet, dann landet der Benutzer mit dem Zurück-Button wieder auf Seite A: document.location.replace("http://www.example.com/"); ==== Seite Neuladen ==== Dies ist nur zur Vollständigkeit da, um eine Entsprechung für das [[#weiterleitenneuladen_mit_refresh_headermeta-tag|Meta-Data Kapitel]] zu liefern. Die folgende Funktion läd die Webseite neu. Ist der Parameter ''false'' oder nicht angegeben, kann die Webseite vom Cache geladen werden [([[https://developer.mozilla.org/en-US/docs/Web/API/Location/reload]])]. document.location.reload(forcedReload); ===== Weiterleiten/Neuladen mit Refresh Header/Meta-Tag ===== Dieses Verfahren wurde nie standardisiert und ist seit HTML 4.0 //explizit unerwünscht// [([[https://www.w3.org/TR/1998/REC-html40-19980424/struct/global.html#h-7.4.4.2]])]. Dennoch existiert es als living Standard in den meisten Browsern. Folgende Syntax sollte von den meisten Browsern verstanden werden[([[https://dxr.mozilla.org/firefox/source/docshell/base/nsDocShell.cpp#4499]])][([[http://www.otsukare.info/2015/03/26/refresh-http-header]])]: ${SECONDS}; url=${URL} Die URL kann absolut oder Relativ sein, wird sie Weg gelassen wird die aktuelle Seite neu geladen. Werden die Sekunden weg gelassen wird sofort neu geladen. Das ganze kann dann entweder in einen HTTP Header eingebaut werden: Refresh: 5; url=http://example.com oder als Meta-Tag in den HTML Head: ==== Anwendungsfälle ==== === Weiterleiten auf die nicht JavaScript Version einer Webseite === === Triviales Neuladen eines Dashboards === Das kann verwendet werden, wenn ein Dashboard ohne viel Aufwand alle paar Minuten neu geladen werden soll. Als HTTP Header kann man es auch fremden Seiten einschleusen, für die man nur Proxy ist. Mit etwas mehr Aufwand würde man vmtl. Ajax verwenden um nur die Daten des Dashboards zu aktualisieren. === Fallback für 3xx Bodys === Siehe [[#weiterleitung_mit_http_status-codes|oben]]. ==== Weitere Infos ==== * [[http://www.otsukare.info/2015/03/26/refresh-http-header|Versuch einer Standardisierung / Übersicht über Kompatibilitäten]]