Unterschied zwischen HTTP-Umleitungscodes

151

Die Unterschiede zwischen den verschiedenen HTTP 3XX-Umleitungscodes sind mir nicht klar. Ja, ich habe die Spezifikation gelesen, aber es scheint hier eine gewisse Diskrepanz zwischen der Standard- und der tatsächlichen Praxis zu geben.

Der 301Umleitungscode scheint klar genug zu sein: Dies bedeutet, dass die Ressource dauerhaft in einen anderen URI verschoben wurde und zukünftige Anforderungen diesen URI verwenden sollten.

Der 307Umleitungscode scheint ebenfalls klar zu sein: Dies bedeutet, dass die Umleitung nur vorübergehend ist und zukünftige Anforderungen weiterhin den ursprünglichen URI verwenden sollten.

Aber ich kann nicht sagen, was der Unterschied zwischen 302und 303ist oder warum sich beide wirklich von unterscheiden 301. Es scheint, dass dies 302ursprünglich als vorübergehende Weiterleitung gedacht war (wie 307), aber in der Praxis wurde es von den meisten Browsern wie eine behandelt 303. Aber was ist der Unterschied zwischen a 303und a 301? Wird 301soll die Umleitung soll bedeuten mehr dauerhaft?

Kanal72
quelle

Antworten:

139
  • 301 : Permanente Weiterleitung. Clients, die nachfolgende Anforderungen für diese Ressource stellen, sollten den neuen URI verwenden. Clients sollten die Umleitung für POST / PUT / DELETE-Anforderungen nicht automatisch befolgen.
  • 302 : Weiterleitung aus undefinierten Gründen. Clients, die nachfolgende Anforderungen für diese Ressource stellen, sollten den neuen URI nicht verwenden. Clients sollten die Umleitung für POST / PUT / DELETE-Anforderungen nicht automatisch befolgen.
  • 303 : Weiterleiten aus undefiniertem Grund. In der Regel wird der Vorgang abgeschlossen und an anderer Stelle fortgesetzt. Clients, die nachfolgende Anforderungen für diese Ressource stellen, sollten den neuen URI nicht verwenden. Clients sollten die Umleitung für POST / PUT / DELETE-Anforderungen befolgen, für die Folgeanforderung jedoch GET verwenden .
  • 307 : Temporäre Weiterleitung. Die Ressource kann zu einem späteren Zeitpunkt an diesen Speicherort zurückkehren. Clients, die nachfolgende Anforderungen für diese Ressource stellen, sollten den alten URI verwenden. Clients sollten der Umleitung für POST / PUT / DELETE-Anforderungen nicht automatisch folgen.

Ich persönlich empfehle, 302 zu vermeiden, wenn Sie die Wahl haben. Viele Clients folgen der Spezifikation nicht, wenn sie auf eine 302 stoßen. Für temporäre Weiterleitungen sollten Sie entweder 303 oder 307 verwenden, je nachdem, welche Art von Verhalten Sie bei Nicht-GET-Anforderungen wünschen. Bevorzugen Sie 307 bis 303, es sei denn, Sie benötigen das alternative Verhalten für POST / PUT / DELETE.

Bob Aman
quelle
26
Nee. Das Folgen eines 303 erfordert das Umschreiben der Methode in GET. Um den anderen zu folgen, muss die Methode beibehalten werden, aber mit der UA bestätigt werden, ob die Methode unsicher ist (also andere Methoden als OPTIONEN, KOPF, ERHALTEN, PROPFINDIEREN ...)
Julian Reschke
1
@JulianReschke Könnten Sie bitte Stellen in den Spezifikationen angeben, die Ihre Aussage stützen?
Piotr Dobrogost
7
@ BobAman In Ihrer Beschreibung machen Sie die gleichen Fehler, die in der ursprünglichen HTTP-Spezifikation ( RFC 1945 ) gemacht wurden. Zum Beispiel, dass Clients der Umleitung für POST / PUT / DELETE-Anforderungen folgen sollten. nach 303 Weiterleitung ohne Angabe, dass das in der folgenden Anfrage zu verwendende http-Verb GET sein muss, ist irreführend ...
Piotr Dobrogost
2
Korrigieren Sie mich: "Um einem 303 zu folgen, muss die Methode in GET umgeschrieben werden, es sei denn, die ursprüngliche Methode war HEAD."
Julian Reschke
2
Piotr: Standardmäßig sollte die Methode nicht geändert werden. Die Ressource wurde verschoben, was sich nicht auf die Manipulation auswirkt. 303 ist eine Ausnahme; Dies bedeutet nicht, dass die Ressource verschoben wurde, sondern dass die Anforderung verarbeitet wurde und hier Ihr Ergebnis ist. Es ist eine ganz andere Art der Weiterleitung. Siehe greenbytes.de/tech/webdav/…
Julian Reschke
84

Der Unterschied zwischen 303 und 307 ist folgender:

303 : Siehe andere. Die Anfrage wird korrekt empfangen, aber die Ergebnisse sollten mit einem GET in der Weiterleitungs-URL abgerufen werden.

307 : Temporäre Weiterleitung. Die gesamte Anfrage sollte an die neue URL umgeleitet werden. Alle Postdaten sollten erneut gepostet werden.

Beachten Sie, dass 302 das Verhalten von 307 haben sollte, aber die meisten Browser haben es als das Verhalten von 303 implementiert (beide existierten damals noch nicht). Daher wurden diese beiden neuen Codes eingeführt, um 302 zu ersetzen.

Der Unterschied zwischen 301 und 303:

301 : Das Dokument wird verschoben. Zukünftige Anfragen sollten die neue URL verwenden. Diese URL ist veraltet.

Hinweis: Seien Sie vorsichtig mit diesem Code. Browser und Proxys wenden in der Regel ein wirklich aggressives Caching an. Wenn Sie also mit einem 301 antworten, kann es lange dauern, bis jemand diese URL erneut aufruft.

303 : Die Anfrage wurde korrekt empfangen. Alle PUT-Anforderungen werden verarbeitet. Das resultierende Dokument kann aus der Umleitungs-URL abgerufen werden. Zukünftige Anfragen sollten weiterhin an die ursprüngliche URL gesendet werden.

GolezTrol
quelle
Ein guter Blog-Beitrag, der sich mit den Details von 3xx (und allen damit verbundenen Problemen) befasst, ist unter: insanecoding.blogspot.no/2014/02/…
arcuri82
@ skeller88 Ihre Änderung hat meine Antwort falsch gemacht, also habe ich sie zurückgesetzt (Boo an die Leute, die die Änderung akzeptiert haben)! Sie haben den gleichen Fehler wie die akzeptierte Antwort eingeführt. 303 ist eine andere Art der Weiterleitung und es gelten andere Regeln, wie durch die Kommentare von Julian Reschke zu der akzeptierten Antwort und dem Blog bestätigt, das von arcuri82
GolezTrol