Fragment adresu URL i przekierowania 302

Wiadomo, że fragment adresu URL (część po #) nie jest wysyłany do serwera.

Zastanawiam się jednak, jak działają fragmenty, gdy zaangażowane jest przekierowanie serwera (poprzez status HTTP 302 i Nagłówek Location:).

Moje pytanie jest naprawdę dwojakie:

  1. Jeśli oryginalny adres URL miał fragment (/original.php#foo), a przekierowanie zostało wykonane na /new.php, czy fragment oryginalnego adresu URL po prostu się gubi? A może czasami jest stosowany do nowego adresu URL?
    czy nowa URL Kiedykolwiek być /new.php#foo w tym przypadku?

  2. Niezależnie od oryginalnego adresu URL, jeśli serwer przekieruje na nowy adres URL z fragmentem (/new.php#foo), czy fragment zostanie "uhonorowany"? Czy serwer naprawdę nie ma prawa ingerować w fragment w ogóle -- i czy przeglądarka zignoruje go po prostu przechodząc do /new.php??

Author: levik, 2010-02-18

3 answers

Aktualizacja 2014-Czerwiec-27:

RFC 7231, Hypertext Transfer Protocol (HTTP / 1.1): Semantics and Content, został opublikowany jako proponowany STANDARD. Z Changelog :

Składnia pola nagłówka lokalizacji została zmieniona, aby umożliwić wszystkim Odniesienia URI, w tym odniesienia względne i fragmenty, wraz z pewnymi wyjaśnieniami, kiedy Korzystanie z fragmentów nie byłoby odpowiednie. (Sekcja 7.1.2)

The ważne punkty z sekcji 7.1.2. Lokalizacja :

Jeśli wartość lokalizacji podana w odpowiedzi 3xx (przekierowanie) nie ma komponentu fragment, agent użytkownika musi przetworzyć przekierowanie tak, jakby wartość dziedziczyła fragment składowy URI odniesienie używane do generowania celu żądania (np. przekierowanie dziedziczy oryginalny fragment Odniesienia, jeśli taki istnieje).

Na przykład, a Generowanie żądania dla referencji URI " http://www.example.org / ~ tim " może spowodować 303 (Zobacz inne) odpowiedź zawierająca pole nagłówka:

Location: /People.html#tim

Co sugeruje, że agent użytkownika przekierowuje na " http://www.example.org/People.html#tim "

Podobnie, generowane jest żądanie GET dla referencji URI " http://www.example.org/index.html#larry" może spowodować 301 (przeniesiony Permanentnie) odpowiedź zawierająca pole nagłówka:

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

Co sugeruje, że user agent przekierowanie do " http://www.example.net/index.html#larry ", zachowując oryginał identyfikator fragmentu.

To powinno jasno odpowiedzieć na twoje pytania.

Update END

Jest to otwarty (nieokreślony) problem z bieżącą specyfikacją HTTP . jest on omówiony w 2 zagadnieniach grupy roboczej IETF httpbis :

#6 zezwala na fragmenty w nagłówku Location. #43 mówi tak:

Właśnie przetestowałem to z różnymi przeglądarkami.

    Firefox i Safari używają fragmentu w nagłówku lokalizacji. Opera używa fragmentu ze źródłowego URI, jeśli jest obecny, w przeciwnym razie fragment z lokalizacji przekierowania.]}
  • IE (8) ignoruje fragment w Uri lokalizacji, więc użyje fragment ze źródła URI, gdy obecny

Propozycja:

"Uwaga: zachowanie, gdy trzeba połączyć identyfikatory fragmentów z oryginalnego URI i przekierowanie, jest niezdefiniowane; obecni agenci użytkownika rzeczywiście różnią się co do tego, który fragment ma pierwszeństwo."

[...]

Wygląda na to, że IE8 używa identyfikatora fragmentu z Location (zachowanie, które widziałem, może być ograniczone do localhost).

Tak więc wydaje się, że mamy konsekwentne zachowanie dla Safari / IE / Firefox / Chrome (właśnie przetestowany), w tym fragment z nagłówka lokalizacji jest używany, bez względu na to, jaki był oryginalny URI.

Dlatego zmieniam moją propozycję, aby udokumentować to zgodnie z oczekiwaniami.

Prowadzi to do najbardziej zgodnej z przeglądarką i przyszłościowej (ponieważ ten problem ostatecznie zostanie ustandaryzowany) odpowiedzi na twoje pytanie:

A: fragmenty oryginalnych adresów URL są odrzucane.

B: fragmenty z nagłówek Location jest honorowany.

 111
Author: ax.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-27 22:09:52

Safari 5 i IE9 i poniżej upuszczają oryginalny fragment URI, jeśli wystąpi przekierowanie HTTP/3XX. Jeśli nagłówek Location w odpowiedzi określa fragment, jest on używany.

IE10+, Chrome 11+, Firefox 4+ i Opera po przekierowaniu 3xx wszystkie "podłączą" oryginalny fragment URI.

Strona testowa: http://www.webdbg.com/test/redir/fragment/.

Zobacz dalszą dyskusję na ten temat na http://blogs.msdn.com/b/ieinternals/archive/2011/05/17/url-fragments-and-redirects-anchor-hash-missing.aspx

 36
Author: EricLaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-02 21:53:48

Aby dać Ci znać, tutaj znajdziesz odpowiednią specyfikację. by W3C definiując jak wszyscy powinni się zachowywać: http://www.w3.org/TR/cuap#uri - klauzula 4.1 - patrz poniżej:

Gdy zasób (URI1) został przeniesiony, przekierowanie HTTP może wskazywać jego nowa lokalizacja (URI2).

Jeśli URI1 ma identyfikator fragmentu # frag, to nowy cel, który agent użytkownika powinien próbować dotrzeć do URI2 # frag. If URI2 ma już identyfikator fragmentu, wtedy #frag nie może być dołączany oraz nowym celem jest URI2.

Błąd: większość obecnych agentów użytkowników implementuje przekierowania HTTP, ale nie dołącza identyfikator fragmentu do nowego URI, który zazwyczaj myli użytkownika, ponieważ kończy się z niewłaściwym zasobem.

Bibliografia:

Przekierowania HTTP są opisane w sekcji 10.3 HTTP/1.1 Specyfikacja [RFC2616]. Wymagane zachowanie jest szczegółowo opisane w "Obsługa identyfikatorów fragmentów w przekierowanych adresach URL "[RURL]. Na termin "Persistent Uniform Resource Locator (PURL)" oznacza adres URL (a szczególny przypadek URI), który wskazuje na inny przez HTTP przekierowanie. Więcej informacji można znaleźć w "Persistent Uniform Resource Lokalizatory " [PURL]. Przykład:

Załóżmy, że użytkownik żąda zasobu w http://www.w3.org/TR/WD-ruby/#changes i serwer przekierowuje user agent to http://www.w3.org/TR/ruby / . Przed pobraniem tego ostatniego URI, przeglądarka powinna dołączyć identyfikator fragmentu # zmiany w nim: http://www.w3.org/TR/ruby/#changes .

 8
Author: Marcin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-28 09:54:03