Przekierowania HTTP są wykonywane za pomocą kodów HTTP 301 i 302 (być może także innych kodów) oraz pola nagłówka znanego jako „Lokalizacja”, które ma adres nowego miejsca, do którego należy przejść. Jednak przeglądarki zawsze wysyłają żądanie „GET” na ten adres URL.
Jednak wiele razy musisz przekierować użytkownika do innej domeny za pomocą POST (na przykład płatności bankowe). Jest to powszechny scenariusz i naprawdę wymaganie. Czy ktoś wie, dlaczego tak powszechny wymóg został pominięty w specyfikacji HTTP? Obejściem tego problemu jest wysłanie formularza (z parametrami w ukrytych polach) z działaniem ustawionym na lokalizację docelową (wartość pola nagłówka Lokalizacja ) i użycie setTimeout
do przesłania formularza do lokalizacji docelowej.
źródło
Odpowiedzi:
W HTTP 1.1 faktycznie znajduje się kod statusu ( 307 ), który wskazuje, że żądanie powinno zostać powtórzone przy użyciu tej samej metody i danych pocztowych .
Jak powiedzieli inni, istnieje tutaj możliwość niewłaściwego użycia , co może być powodem, dla którego wiele ram trzyma się 301 i 302 w swoich abstrakcjach. Jednak przy odpowiednim zrozumieniu i odpowiedzialnym użytkowaniu powinieneś być w stanie osiągnąć to, czego szukasz.
Należy zauważyć, że zgodnie z w3.org ciemno , gdy
METHOD
nie jestHEAD
lubGET
, aplikacje klienckie powinny skłonić użytkownika przed ponownym wykonaniem wniosku w nowej lokalizacji. Powinieneś także podać notatkę i mechanizm awaryjny dla użytkownika, na wypadek gdyby stare programy klienckie nie były pewne, co zrobić z 307.Za pomocą tego formularza:
A Test307.aspx po prostu zwraca 307 z lokalizacją: http://google.com , Chrome 13 i Fiddler potwierdzają, że „test = test” jest rzeczywiście opublikowany w Google. Oczywiście dalszą odpowiedzią jest 405, ponieważ Google nie pozwala na POST, ale pokazuje mechanikę.
Aby uzyskać więcej informacji, zobacz Lista kodów stanu HTTP i specyfikacja W3.org .
źródło
Znalazłem dobre wyjaśnienie w tej stronie tutaj .
Chociaż nie jestem fanem ograniczania użytkowników pod względem technicznym, aby zapobiec powodowaniu niechcianego chaosu lub wyrządzaniu niepożądanej szkody ich aplikacjom, rozumiem ten punkt i ma to sens.
źródło
GET (i kilka innych metod) są zdefiniowane jako „SAFE” w specyfikacji http ( RFC 2616 ):
Oznacza to, że żądanie GET nigdy nie powinno mieć poważnych konsekwencji dla użytkownika, poza tym, że zobaczy coś, czego może nie chcieć zobaczyć, ale żądanie POST może zmienić zasób, który jest dla niego ważny lub dla innych osób.
Chociaż zmieniło się to w JavaScript, tradycyjnie istniały różne interfejsy użytkownika - użytkownicy mogli wywoływać żądania GET, klikając linki, ale musieli wypełnić formularz, aby wywołać żądanie POST. Myślę, że projektanci HTTP chcieli zachować rozróżnienie między metodami bezpiecznymi i niezabezpieczonymi.
Nie sądzę też, aby kiedykolwiek konieczne było przekierowanie do POST. Wszelkie działania, które należy wykonać, można przypuszczalnie wykonać przez wywołanie funkcji w kodzie serwera lub, jeśli trzeba to zrobić na innym serwerze, zamiast wysyłać przekierowanie zawierające adres URL przeglądarki do POST na serwer może wysłać zapytanie do tego samego serwera, działając jak proxy dla użytkownika.
źródło