Metoda POST i przekierowania

Series: publications March 09, 2018

Niedawno jednym z problemów przed jakim miałem okazję stanąć było umożliwienie przekazania całej zawartości ładunku kierowanego pod dany adres za pomocą metody POST z którego miało nastąpić przekierowanie pod inny adres.

Nie dało się tego załatwić za pomocą standardowych przekierowań, tj. 301 i 302.

Rozwiązaniem było wykorzystanie przekierowania o kodzie 307 lub 308 tylko dla metody POST, której cała zawartość miała zostać przekazana dalej.

Spis treści

Wprowadzenie

Opis wybranych przekierowań

Protokół HTTP definiuje kilka typów przekierowań. Najczęściej wykorzystywane są te o kodach 301 oraz 302.

Samo przekierowanie informuje przeglądarkę klienta o konieczności podążania za innym adresem w celu dostępu do danej treści.

Poniżej znajduje się krótki opis wybranych:

  • 301 (moved permanently) - przekierowanie stałe, które jest najbardziej skuteczną i przyjazną dla przeglądarek metodą przekierowania. Informuje klienta o bezpowrotnym przeniesieniu danego zasobu w inne miejsce (żądany zasób zmienił swój adres URL). Co ważne, tego typu przekierowanie powoduje, że treść dostępna jest w wyszukiwaniach tylko pod jednym adresem.

  • 302 (found) - przekierowanie tymczasowe, które informuje klienta, że żądany zasób chwilowo dostępny jest pod innym adresem a wszystkie przyszłe odwołania powinny być kierowane pod adres pierwotny. Roboty indeksujące traktują ten rodzaj przekierowania jako “tymczasowy” - w indeksie wyszukiwarki istnieje stary oraz nowy adres danego zasobu (w przeciwieństwie do przekierowania 301).

  • 303 (see other) - ten rodzaj przekierowania jest bardzo podobny do przekierowania 302 jednak głównie ma na celu przekazanie żądania POST do zasobu GET (kontynuacja komunikacji jest jawnie zmieniona na metodę GET Warto pamiętać, że ten kod odpowiedzi wysyłany jest z powrotem w wyniku metod PUT i POST a ostatecznie dany zasób pobierany jest za pomocą standardowej metody GET.

  • 307 (temporary redirect) - przekierowanie to jest takie samo jak te o kodzie 302 z tym wyjątkiem, że żądanie kontynuacji jest dokładnie takie samo jak pierwotne żądanie a potwierdzenie komunikacji musi zostać uzyskane dla metod innych niż metody GET i HEAD. Ten typ przekierowania pozwala na przesłanie całej zawartości (nie zmienionej) metody POST w inne miejsce.

  • 308 (permanent redirect) - wskazuje, że żądany zasób został definitywnie przeniesiony na adres URL podany w nagłówkach Location. Dokładnie jak przekierowanie o kodzie 307 pozwala na przesłanie zawartości (body) metody POST.

Porównanie

Code Message Method handling
301 Moved Permanently GET methods unchanged.
302 Found GET methods unchanged.
303 See Other GET methods unchanged. Others changed to GET.
307 Temporary Redirect Method and body not changed.
308 Permanent Redirect Method and body not changed.

Przykład konfiguracji

Przykład poprawnej konfiguracji dla serwera Nginx:

location / {
    proxy_pass              http://localhost:80;
    client_max_body_size    10m;
}

location /api {
    # Przekierowanie 307 tylko dla metody POST:
    if ($request_method = POST) {
        return 307 https://api.example.com?request_uri;
    }

    # Dla pozostałych metod przekierowanie 301:
    rewrite ^ https://api.example.com?request_uri permanent;

    client_max_body_size    10m;
}

built with Jekyll and trimstray blog — read the fine print