Powszechnie wiadomo, że fragment adresu URL (część po znaku #
) nie jest wysyłany na serwer.
Zastanawiam się jednak, jak działają fragmenty, gdy w grę wchodzi przekierowanie serwera (przez stan HTTP 302 i Location:
nagłówek).
Moje pytanie jest naprawdę dwojakie:
Jeśli pierwotny adres URL miał fragment (
/original.php#foo
) i następuje przekierowanie/new.php
, czy fragment oryginalnego adresu URL po prostu się zgubi? A może czasami jest stosowany do nowego adresu URL?
Czy nowy adres URL będzie kiedykolwiek/new.php#foo
w takim przypadku?Niezależnie od oryginalnego adresu URL, jeśli serwer przekierowuje do nowego adresu URL z fragmentem (
/new.php#foo
), czy fragment zostanie „uhonorowany”? A może serwer naprawdę nie ma żadnego interesu w ingerowaniu w ten fragment - i czy w związku z tym przeglądarka zignoruje go, po prostu przechodząc do/new.php
??
Odpowiedzi:
Aktualizacja 2014-czerwiec-27 :
RFC 7231, Hypertext Transfer Protocol (HTTP / 1.1): Semantics and Content , został opublikowany jako PROPONOWANY STANDARD. Z Changelog :
Ważne punkty z sekcji 7.1.2. Lokalizacja :
Powinno to jasno odpowiedzieć na Twoje pytania.
Zaktualizuj END
jest to otwarty (nieokreślony) problem z aktualną specyfikacją HTTP . omówiono go w 2 wydaniach grupy roboczej IETF httpbis :
# 6 zezwala na fragmenty w
Location
nagłówku. # 43 mówi tak:Prowadzi to do najbardziej kompatybilnej z przeglądarkami i przyszłościowej (ponieważ ten problem ostatecznie zostanie ujednolicony) odpowiedzi na Twoje pytanie:
O: fragmenty z oryginalnych adresów URL są odrzucane.
B: fragmenty
Location
nagłówka są honorowane.źródło
Safari 5 i IE9 i starsze usuwają fragment oryginalnego identyfikatora URI, jeśli wystąpi przekierowanie HTTP / 3xx. Jeśli nagłówek Location odpowiedzi określa fragment, jest on używany.
IE10 +, Chrome 11+, Firefox 4+ i Opera wszystkie „ponownie dołączą” oryginalny fragment URI po wykonaniu przekierowania 3xx.
Strona testowa: http://www.webdbg.com/test/redir/fragment/ .
Zobacz dalsze omówienie tego problemu pod adresem http://blogs.msdn.com/b/ieinternals/archive/2011/05/17/url-fragments-and-redirects-anchor-hash-missing.aspx
źródło
Location
zawiera fragment, zachowa go poprawnie. Ale jeśli przekierowanieLocation
z fragmentem przechodzi przez inne przekierowanie 3xx, w niewytłumaczalny sposób zignoruje fragment z pierwszego przekierowania, co nie jest zgodne z 2 poprzednimi zachowaniami. Chrome i Firefox konsekwentnie go zachowują.Abyś wiedział, tutaj znajdziesz odpowiednią specyfikację. przez w3c definiujące, jak wszyscy powinni się zachowywać: http://www.w3.org/TR/cuap#uri - punkt 4.1 - patrz poniżej:
źródło
Publikowanie podobnego problemu z rozwiązaniem, które napotkałem.
Mam nadzieję, że pomoże to komuś z podobnym wymogiem
preserving hash in IE
przekierowań 302.Dodanie istotnych części odpowiedzi zamiast samych linków
Używamy
SiteMinder
W naszej aplikacji uwierzytelnianie.Doszedłem do wniosku, że po udanym uwierzytelnieniu,
SiteMinder
wykonuje302 redirection
żądaną przez użytkownika stronę aplikacji za pomocą ukrytej zmiennej formularza logowaniavalue
(gdzie przechowuje żądany przez użytkownika adres URL/myapp/
-without hash fragment
ponieważ nie zostanie wysłany na serwer) o nazwie podobnej doredirect
. Przykładowy formularz poniżejPonieważ
redirect
ukryta wartość zmiennej zawiera tylko/myapp/
fragment z krzyżykiem i jest to przekierowanie 302, fragment skrótu jest automatycznie usuwany przez IE nawet przed wejściem do naszej aplikacji i niezależnie od rozwiązań, które próbujemy w naszym kodzie aplikacji, nie działają.IE przekierowuje do
/myapp/
tylko i ląduje na domyślnej stronie głównej naszej aplikacjihttps://ourapp.com/myapp/#/home
.Zmarnowałem prawie dzień, aby zrozumieć to zachowanie.
Rozwiązaniem jest:
Zmieniliśmy formularz logowania zmienne ukryte (
redirect
) wartość utrzymać ten fragment hash dołączającwindow.location.hash
wraz z istniejącą wartość. Podobny do poniższego koduPo tej zmianie
redirect
ukryta zmienna przechowuje żądaną przez użytkownika wartość adresu URL jako/myapp/#/pending/requests
iSiteMinder
przekierowuje ją/myapp/#/pending/requests
w IE.Powyższe rozwiązanie działa poprawnie we wszystkich trzech przeglądarkach
Chrome, Firefox and IE
.Dzięki @AlexFord za szczegółowe wyjaśnienie i rozwiązanie tego problemu.
źródło