URL-Fragment und 302 Weiterleitungen

136

Es ist bekannt, dass das URL-Fragment (der Teil nach dem #) nicht an den Server gesendet wird.

Ich frage mich allerdings, wie Fragmente funktionieren, wenn eine Serverumleitung (über HTTP-Status 302 und Location:Header) beteiligt ist.

Meine Frage ist wirklich zweifach:

  1. Wenn die ursprüngliche URL ein Fragment ( /original.php#foo) hatte und eine Umleitung zu erfolgt /new.php, geht der Fragmentteil der ursprünglichen URL einfach verloren? Oder wird es manchmal auf die neue URL angewendet?
    Wird die neue URL jemals /new.php#fooin diesem Fall sein?

  2. Wird der Fragment unabhängig von der ursprünglichen URL /new.php#foo"geehrt" , wenn der Server mit einem Fragment ( ) zu einer neuen URL umleitet ? Oder hat der Server wirklich überhaupt nichts damit zu tun, das Fragment zu stören - und wird der Browser es daher ignorieren, indem er einfach zu geht /new.php?

Levik
quelle
1
Hier finden Sie die Spezifikation von W3C: w3.org/TR/cuap#uri Klausel 4.1. Das Fragment sollte bei der Umleitung erhalten bleiben.
Marcin

Antworten:

135

Update 27.06.2014 :

RFC 7231, Hypertext Transfer Protocol (HTTP / 1.1): Semantik und Inhalt , wurde als VORGESCHLAGENER STANDARD veröffentlicht. Aus dem Changelog :

Die Syntax des Felds "Standort-Header" wurde geändert, um alle URI-Referenzen, einschließlich relativer Referenzen und Fragmente, sowie einige Klarstellungen zuzulassen, wann die Verwendung von Fragmenten nicht angemessen wäre. (Abschnitt 7.1.2)

Die wichtigen Punkte aus Abschnitt 7.1.2. Ort :

Wenn der in einer 3xx-Antwort (Umleitung) angegebene Standortwert keine Fragmentkomponente enthält, MUSS ein Benutzeragent die Umleitung so verarbeiten, als ob der Wert die Fragmentkomponente der URI-Referenz erbt, die zum Generieren des Anforderungsziels verwendet wird (dh die Umleitung erbt das Fragment der Originalreferenz, falls vorhanden).

Beispielsweise kann eine für die URI-Referenz " http://www.example.org/~tim " generierte GET-Anforderung zu einer 303-Antwort (siehe Andere) führen, die das Header-Feld enthält:

Location: /People.html#tim

Dies deutet darauf hin, dass der Benutzeragent zu " http://www.example.org/People.html#tim " umleitet.

Ebenso kann eine GET-Anforderung, die für die URI-Referenz " http://www.example.org/index.html#larry " generiert wurde, zu einer 301-Antwort (dauerhaft verschoben) führen, die das Header-Feld enthält:

Location: http://www.example.net/index.html

Dies legt nahe, dass der Benutzeragent zu " http://www.example.net/index.html#larry " umleitet , wobei die ursprüngliche Fragmentkennung beibehalten wird.

Dies sollte Ihre Fragen klar beantworten.

Update END

Dies ist ein offenes (nicht angegebenes) Problem mit der aktuellen HTTP-Spezifikation . Es wird in zwei Ausgaben der IETF-Arbeitsgruppe httpbis behandelt :

# 6 erlaubt Fragmente im LocationHeader. # 43 sagt dies:

Ich habe dies gerade mit verschiedenen Browsern getestet.

  • Firefox und Safari verwenden das Fragment im Speicherort-Header.
  • Opera verwendet das Fragment aus dem Quell-URI, sofern vorhanden, andernfalls das Fragment aus dem Umleitungsspeicherort
  • IE (8) ignoriert das Fragment in der Standort-URI und verwendet daher das Fragment aus der Quell-URI, falls vorhanden

Vorschlag:

"Hinweis: Das Verhalten, wenn Fragment-IDs aus dem ursprünglichen URI und der Umleitung kombiniert werden müssen, ist undefiniert. Die aktuellen Benutzeragenten unterscheiden sich tatsächlich darin, welches Fragment Vorrang hat."

[...]

Es scheint , dass IE8 hat das Fragment idenfitier aus verwenden Location(das Verhalten , das ich sehe könnte auf localhost beschränkt sein).

Daher scheinen wir für Safari / IE / Firefox / Chrome (gerade getestet) ein konsistentes Verhalten zu haben, da das Fragment aus dem Location-Header verwendet wird, unabhängig von der ursprünglichen URI.

Ich ändere daher meinen Vorschlag, um das erwartete Verhalten zu dokumentieren .

Dies führt zu der am besten kompatiblen und zukunftssicheren Antwort auf Ihre Frage (da dieses Problem möglicherweise standardisiert wird):

A: Fragmente von Original-URLs werden verworfen.

B: Fragmente aus dem LocationHeader werden berücksichtigt.

Axt.
quelle
1
Ich hatte einige "Umschreib" -Regeln vergessen, die ich in HTTP-Servern festgelegt hatte und die wahrscheinlich als 301-Umleitung implementiert wurden. Infolgedessen verlor der IE immer wieder die Fragmentkennung, da bei mehreren Umleitungen die durch die erste Umleitung festgelegten Fragmente Teil der Quell- URI in der zweiten werden.
Eugene Yokota
In Oper 12.12 wird das Fragment im Positionsheader berücksichtigt, wenn es vorhanden ist.
Ziege
4
In den aktuellen Versionen von Chrome und Firefox: A ist nicht wahr. In der aktuellen Version von Firefox: B ist nicht wahr. Wenn Sie Hashes verwenden müssen (z. B. das Routing von Backbone), scheint die auf Javascript basierende Umleitung derzeit Ihre einzige echte Option zu sein.
a.real.human.being
Der zitierte Block scheint sich selbst zu widersprechen. Zuerst heißt es "IE (8) ignoriert das Fragment in der Standort-URI und verwendet daher das Fragment aus der Quell-URI, falls vorhanden", später heißt es "Es scheint, dass IE8 die Fragment-ID aus Position verwendet". Bezieht sich der erste auf etwas anderes als der zweite?
Davidtbernal
B gilt nicht für Chome 45.0.2454.85. B gilt für Firefox 40.0.3.
Jingguo Yao
44

Safari 5 und IE9 und darunter löschen das Fragment des ursprünglichen URI, wenn eine HTTP / 3xx-Umleitung auftritt. Wenn der Location-Header in der Antwort ein Fragment angibt, wird es verwendet.

IE10 +, Chrome 11+, Firefox 4+ und Opera "verbinden" das Fragment des ursprünglichen URI nach einer 3xx-Umleitung erneut.

Testseite: http://www.webdbg.com/test/redir/fragment/ .

Weitere Informationen zu diesem Problem finden Sie unter http://blogs.msdn.com/b/ieinternals/archive/2011/05/17/url-fragments-and-redirects-anchor-hash-missing.aspx

EricLaw
quelle
2
Tatsächlich verhält sich IE10 immer noch anders als die neuesten Firefox- und Chrome-Versionen. Bei einer einfachen Umleitung scheint das Fragment aus der Quell-URL erhalten zu bleiben. Und wenn die Umleitung Locationein Fragment enthält, wird es korrekt beibehalten. Aber wenn ein umgeleiteter Locationmit einem Fragmente einer anderen 3xx Umleitung durchläuft, wird es aus unerklärlichen Gründen das Fragment aus der ersten Umleitung ignorieren, die mit den zwei vorherigen Verhalten nicht im Einklang steht. Chrome und Firefox bewahren es konsequent auf.
Odony
Ich habe bestätigt, dass Sie richtig sind. Siehe den letzten Testlink
EricLaw
11

Nur um Sie wissen zu lassen, finden Sie hier die richtige Spezifikation. von w3c definiert, wie sich alle verhalten sollen: http://www.w3.org/TR/cuap#uri - Klausel 4.1 - siehe unten:

Wenn eine Ressource (URI1) verschoben wurde, kann eine HTTP-Umleitung ihren neuen Speicherort (URI2) angeben.

Wenn URI1 eine Fragmentkennung #frag hat, ist URI2 # frag das neue Ziel, das der Benutzeragent erreichen möchte. Wenn URI2 bereits eine Fragmentkennung hat, darf #frag nicht angehängt werden und das neue Ziel ist URI2.

Falsch: Die meisten aktuellen Benutzeragenten implementieren HTTP-Umleitungen, hängen die Fragment-ID jedoch nicht an den neuen URI an, was den Benutzer im Allgemeinen verwirrt, da sie am Ende die falsche Ressource haben.

Verweise:

HTTP-Weiterleitungen sind in Abschnitt 10.3 der HTTP / 1.1-Spezifikation [RFC2616] beschrieben. Das erforderliche Verhalten wird ausführlich in "Umgang mit Fragmentkennungen in umgeleiteten URLs" [RURL] beschrieben. Der Begriff "Persistent Uniform Resource Locator (PURL)" bezeichnet eine URL (ein Sonderfall eines URI), die über eine HTTP-Umleitung auf eine andere URL verweist. Weitere Informationen finden Sie unter "Persistent Uniform Resource Locators" [PURL]. Beispiel:

Angenommen, ein Benutzer fordert die Ressource unter http://www.w3.org/TR/WD-ruby/#changes an und der Server leitet den Benutzeragenten an http://www.w3.org/TR/ruby/ weiter . Vor dem Abrufen dieser letzteren URI sollte der Browser die Fragmentkennung #changes an sie anhängen: http://www.w3.org/TR/ruby/#changes .

Marcin
quelle
0

Posten eines ähnlichen Problems mit der Lösung, mit der ich konfrontiert bin.

Hoffe, es hilft jemandem mit der ähnlichen Anforderung von preserving hash in IE302 Weiterleitungen.

Prathap Reddy
quelle