307 Tymczasowe przekierowanie

Czym jest 307 Temporary Redirect, jak — w przeciwieństwie do 302 — rygorystycznie zachowuje metodę HTTP, gdzie się pojawia (HSTS, tymczasowe przeniesienia) i jak Google traktuje go w SEO.

Opublikowano po raz pierwszy: 28 cze 2026 · Ostatnia aktualizacja: 8 sie 2026 · Advanced
Języki
1 sygnał dowodowy na tej stronie

307 Temporary Redirect oznacza dla Google to samo co 302 — słaby, tymczasowy sygnał, który nie przekazuje rankingu oryginalnego adresu URL na cel — więc nie ma rankingowego powodu, by preferować jeden nad drugim. Jedyna rzeczywista różnica względem 302 to gwarancja specyfikacji: 307 nie może zmienić metody ani ciała żądania, więc POST pozostaje POST-em. Ma to znaczenie w formularzach, API i nowoczesnych frameworkach (Next.js domyślnie używa 307), ale nie przy zwykłych przekierowaniach stron GET. 307, który najbardziej myli ludzi, wcale nie jest przekierowaniem: to artefakt HSTS widoczny wyłącznie w przeglądarce, gdy podnosi HTTP do HTTPS, z ciałem o rozmiarze 0 bajtów, którego serwer nigdy nie wysłał — checker przekierowań lub zwykłe żądanie curl (nie tylko nowa sesja incognito, która nie może obejść domeny z preload HSTS) pokaże prawdziwy kod stanu.

TL;DR — 307 to tymczasowe przekierowanie, które zgodnie z RFC 9110 “MUST NOT change the request method” (tłumaczenie) „NIE MOŻE zmieniać metody żądania” — jedyna twarda gwarancja, której 302 nie zapewnia. Dla SEO nie ma znaczenia: dokumentacja Google wymienia je jako “Equivalent to 302 (tłumaczenie) „równoważne z 302” (słaby, tymczasowy sygnał), a Mueller powiedział, że wybór 307 kontra 302 “doesn’t really matter” (tłumaczenie) „właściwie nie ma znaczenia” dla wyszukiwania — chodzi o to, czy przekierowanie musi działać dla ruchu POST/API. 307, który naprawdę myli ludzi, to artefakt HSTS: przeglądarkowy „redirect” o rozmiarze 0 bajtów, którego serwer nigdy nie wysłał, powstały, gdy przeglądarka sama ulepsza HTTP do HTTPS. Istnieją dwa funkcjonalnie niepowiązane przypadki, a oddzielenie ich jest całym zadaniem.

307 ma dwa całkowicie różne przypadki

To porządkująca idea dla całego artykułu i wynika wprost z mojego poradnika o kodach stanu, w którym 307 ma dwa osobne wpisy: “307 Temporary Redirect – Has the same functionality as a 302 redirect, except you can’t switch between POST and GET” (tłumaczenie) „ma tę samą funkcję co 302, ale nie można przełączać POST i GET” oraz “307 HSTS Policy – Forces the client to use HTTPS when making requests instead of HTTP” (tłumaczenie) „wymusza używanie HTTPS zamiast HTTP podczas żądań”. Łączy je numer, a prawie nic poza nim:

  1. 307 jako prawdziwe, wydane przez serwer przekierowanie tymczasowe — wybrane celowo (albo ustawione domyślnie przez framework), aby zachować metodę HTTP i ciało przy żądaniu innym niż GET.
  2. 307 jako artefakt HSTS w przeglądarce — w ogóle nie jest odpowiedzią serwera. Przeglądarka wewnętrznie podnosi HTTP do HTTPS i oznacza to podniesienie jako 307.

Mieszanie tych dwóch przypadków jest najczęstszym źródłem nieporozumień dotyczących 307. Omówię je po kolei.

Przypadek 1: prawdziwy 307 — czego wymaga specyfikacja

RFC 9110 (bieżąca specyfikacja semantyki HTTP) jest jednoznaczne w §15.4.8:

“The 307 (Temporary Redirect) status code indicates that the target resource resides temporarily under a different URI and the user agent MUST NOT change the request method if it performs an automatic redirection to that URI.” (tłumaczenie) „Kod stanu 307 (Temporary Redirect) oznacza, że zasób docelowy znajduje się tymczasowo pod innym URI, a klient użytkownika NIE MOŻE zmienić metody żądania, jeśli automatycznie przekierowuje do tego URI.”

Evidence for this claim RFC 9110 defines 307 Temporary Redirect as a temporary move and requires clients not to change the request method when following it automatically. Scope: HTTP semantics for real server 307 responses, not browser-internal HSTS displays. Confidence: high · Verified: IETF: RFC 9110 §15.4.8 — 307 Temporary Redirect

To „MUST NOT” jest twardym wymogiem, a nie sugestią. Porównaj je z sekcją 302 (§15.4.3), która otwarcie dokumentuje historyczny bałagan, do którego naprawy powstał 307: “For historical reasons, a user agent MAY change the request method from POST to GET for the subsequent request. If this behavior is undesired, the 307 (Temporary Redirect) status code can be used instead.” (tłumaczenie) „Z powodów historycznych klient użytkownika MOŻE zmienić metodę POST na GET przy kolejnym żądaniu. Jeśli takie zachowanie jest niepożądane, można użyć kodu 307.” Innymi słowy, 307 istnieje konkretnie po to, by usunąć niejednoznaczność POST→GET, która występowała w starszych klientach przy 302.

MDN podaje praktyczną wersję tego samego rozróżnienia:

“The difference between 307 and 302 is that 307 guarantees that the client will not change the request method and body when the redirected request is made. With 302, older clients incorrectly changed the method to GET. 307 and 302 responses are identical when the request method is GET.” (tłumaczenie) „Różnica między 307 i 302 polega na tym, że 307 gwarantuje zachowanie metody i ciała żądania przy przekierowaniu. Starsze klienty przy 302 nieprawidłowo zmieniały metodę na GET. Odpowiedzi 307 i 302 są identyczne, gdy metoda żądania to GET.”

To ostatnie zdanie ma największe znaczenie dla SEO. Prawie każde przekierowanie interesujące specjalistę SEO — stara strona do nowej — jest żądaniem GET, a przy GET 307 i 302 są dosłownie identyczne. Gwarancja zachowania metody ma znaczenie tylko wtedy, gdy metoda nie jest GET: przy ponownym wysyłaniu formularzy, endpointach API, celach webhooków i przekazywaniu POST-u w checkoutach lub uwierzytelnianiu. Specyfikacja gwarantuje metodę i ciało — sama w sobie nie ustala dokładnej obsługi nagłówków, danych uwierzytelniających ani żądań cross-origin przy ponownym odtworzeniu, więc sprawdź to z rzeczywistym klientem zamiast zakładać zachowanie bajt w bajt. Jeśli porównujesz oba kody przy zwykłym przeniesieniu strony, temat szczegółowo omawia osobny artykuł o 302 kontra 307 — ten zakłada znajomość podstaw tymczasowego przekierowania z pogłębienia o 302 i skupia się na tym, co w 307 wyjątkowe.

302 a 303 a 307 w jednej tabeli

Wszystkie trzy należą w RFC do kategorii „tymczasowe”, ale nie zachowują się tak samo na dwóch osiach, które naprawdę mają znaczenie — zachowaniu metody i cache:

KodMetoda przy automatycznym przekierowaniuMożliwość heurystycznego cache?
302 FoundMoże zmienić POST na GET (historyczne zachowanie klienta, nie wymóg RFC)Nie
303 See OtherCelowo pobiera cel metodą GET lub HEADNie
307 Temporary RedirectNIE MOŻE zmienić metodyNie

Żaden z tych trzech kodów nie jest domyślnie heurystycznie zapisywany w cache — 307 (podobnie jak 302 i 303) potrzebuje jawnego sygnału świeżości (Cache-Control, Expires itd.), zanim cache zapisze go bez ponownego pytania.

Przypadek 1, ciąg dalszy: jak Google traktuje prawdziwy 307 w SEO

Krótka odpowiedź: dokładnie jak 302. Dokumentacja Google Kody stanu HTTP wymienia wiersz 307 jako “Equivalent to 302 (tłumaczenie) „jest równoważny z kodem 302”, a odziedziczony wiersz 302 wyjaśnia, co to oznacza:

“By default, Google’s crawlers follow the redirect, and Google systems use the redirect as a weak signal that the redirect target should be processed.”(tłumaczenie) „Domyślnie crawlery Google podążają za przekierowaniem, a systemy Google używają przekierowania jako słabego sygnału, że cel powinien zostać przetworzony.”

„Słaby” to słowo kluczowe — tymczasowe przekierowanie nie konsoliduje kanonizacji na celu tak jak stałe. Dokument Google Przekierowania i wyszukiwarka Google grupuje 302, 303 i 307 jako “temporary” (tłumaczenie) „tymczasowe” i opisuje zachowanie wprost: “Googlebot follows the redirect, but the indexing pipeline doesn’t use the redirect as a signal that the redirect target should be canonical.” (tłumaczenie) „Googlebot podąża za przekierowaniem, ale potok indeksowania nie używa go jako sygnału, że cel powinien być kanoniczny.” Na tej samej stronie, w tym samym ujęciu intencji: “If you just want to send users to a different page temporarily, use a temporary redirect.” (tłumaczenie) „Jeśli chcesz tylko tymczasowo wysłać użytkowników na inną stronę, użyj tymczasowego przekierowania.”

Evidence for this claim Google's indexing pipeline does not use a temporary 302, 303, or 307 redirect as a signal that the redirect target should be canonical. Scope: redirect crawling, indexing, and canonicalization Confidence: high · Verified: Redirects and Google Search

Zaraz po wierszach 307 i 308 Google dodaje zastrzeżenie warte wytatuowania na ścianie:

“While Google treats these status codes the same way, keep in mind that they’re semantically different. Use the status code that’s appropriate for the redirect so other clients (for example, e-readers, other search engines) may benefit from it.” (tłumaczenie) „Choć Google traktuje te kody stanu tak samo, pamiętaj, że różnią się semantycznie. Użyj kodu odpowiedniego dla przekierowania, aby inne klienty, np. czytniki e-booków i inne wyszukiwarki, również mogły na tym skorzystać.”

Google grupuje więc 307 i 302 razem dla rankingu, ale nadal mówi, aby wybrać kod poprawny semantycznie. To cała odpowiedź SEO. Evidence for this claim Google treats 307 as equivalent to 302 for Search while noting that the HTTP semantics differ. Scope: Google Search redirect handling; clients still need the semantically appropriate status code. Confidence: high · Verified: Google: HTTP status codes and Search John Mueller ujął to jeszcze dosadniej w 51. odcinku podcastu „Porozmawiajmy o przekierowaniach”, wyjaśniając, że “with 307, 308, it also forwards POST requests” (tłumaczenie) „307 i 308 również przekazują żądania POST” — w przeciwieństwie do 301/302, które przekazują żądania GET — po czym przechodzi do sedna:

“I think for SEO, it doesn’t really matter. It’s more like, I don’t know… Does it work for APIs or not? And usually, APIs are not something that you need to have indexed directly in Search.” (tłumaczenie) „W ujęciu SEO nie ma to właściwie znaczenia. Pytanie brzmi raczej, czy działa dla API; API zwykle nie trzeba bezpośrednio indeksować w Search.”

Nie ma rankingowej korzyści ze zmiany tymczasowych przekierowań na 307. Jedynym prawidłowym powodem wyboru tego kodu jest zachowanie metody i ciała — albo, jako ogólna preferencja przyszłościowa, którą omówię na końcu.

Przypadek 1, ciąg dalszy: domyślne ustawienia frameworków i CDN-ów

Coraz więcej pytań „dlaczego to jest 307?” nie dotyczy w ogóle celowych decyzji — to domyślne ustawienia frameworków. Funkcja redirect() Next.js domyślnie zwraca 307, a dokumentacja wprost wyjaśnia dlaczego, pod nagłówkiem “Why does redirect use 307 and 308?” (tłumaczenie) „Dlaczego funkcja redirect używa 307 i 308?”: “The redirect() method uses a 307 by default, instead of a 302 temporary redirect, meaning your requests will always be preserved as POST requests.” (tłumaczenie) „Metoda redirect() domyślnie używa 307 zamiast tymczasowego 302, więc żądania zawsze zachowują się jako POST.” (Next.js używa 303 konkretnie w Server Actions i ma osobne permanentRedirect() dla przypadku 308.) Jeśli widzisz 307, którego nie napisałeś ręcznie, sprawdź, czy framework lub platforma brzegowa domyślnie nie używa go przy przekierowaniach innych niż GET — zwykle to właśnie odpowiedź i zwykle poprawna.

Przypadek 2: „widmowy 307” HSTS, którego serwer nigdy nie wysłał

To obszar rzeczywiście niedostatecznie omawiany i powód, dla którego osobny artykuł o 307 ma sens. Gdy witryna wysyła nagłówek Strict-Transport-Security (HSTS), mówi przeglądarce: od teraz ładuj mnie wyłącznie przez HTTPS. Przy następnym żądaniu wersji HTTP przeglądarka sama przechodzi na HTTPS, bez rozmowy z serwerem — i pokazuje to wewnętrzne podniesienie jako „307” w narzędziach deweloperskich i crawlerach.

John Mueller wyjaśnił ten mechanizm na swojej prywatnej stronie:

“After seeing the HTTPS URL with the HSTS header (for example, with any redirect from the HTTP version), Chrome will act like it’s seeing a 307 redirect the next time you try to access the HTTP page. Your server’s not returning a 307, Chrome is just showing it to you as such to explain that it’s doing the redirect for you.” (tłumaczenie) „Po zobaczeniu adresu HTTPS z nagłówkiem HSTS Chrome zachowa się tak, jakby przy następnym dostępie do strony HTTP widział przekierowanie 307. Serwer nie zwraca 307; Chrome tylko pokazuje to w ten sposób, aby wyjaśnić, że samo wykonuje przekierowanie.”

Ciało o rozmiarze 0 bajtów jest wskazówką — jak dodaje Mueller, “the 307 isn’t actually a redirect at all, it’s just a placeholder” (tłumaczenie) „307 wcale nie jest przekierowaniem, tylko symbolem zastępczym”. Mój poradnik o przekierowaniach ujmuje praktyczną konsekwencję dla audytu tak: “When web servers require clients to only use HTTPS connections (HSTS policy), Google won’t see the 307 because it’s cached in the browser. The initial hit (without cache) will have a server response code that’s likely a 301 or a 302. But your browser will show you a 307 for subsequent requests which makes it more difficult to troubleshoot. You will need to use a fresh Incognito session to see the returned status code.” (tłumaczenie) „Gdy serwery wymagają wyłącznie HTTPS, Google nie zobaczy 307, bo jest on zapisany w przeglądarce; pierwsze żądanie bez cache prawdopodobnie otrzyma 301 lub 302, ale kolejne przeglądarka pokaże jako 307, co utrudnia diagnozę. Trzeba użyć nowej sesji incognito, aby zobaczyć zwrócony kod.”

Co Googlebot naprawdę widzi przy HSTS i jak zmieniała się historia

Warto przeczytać razem dwie wypowiedzi Google oddalone o pięć lat. W grudniu 2015 r. Zineb Ait Bahajji (wówczas w Google) powiedziała, według Search Engine Roundtable: “With HSTS implemented, Googlebot sees a 301 redirect (try it with Fetch as Google). The 307 is just an ‘internal redirect’.” (tłumaczenie) „Przy wdrożonym HSTS Googlebot widzi przekierowanie 301 (sprawdź w Fetch as Google). 307 jest tylko „wewnętrznym przekierowaniem”.” W październiku 2020 r. ujęcie Muellera w filmie Ask Google Webmasters (przez Search Engine Journal) było nieco inne: “In short, [Googlebot] doesn’t interact with them. 307 redirects are generally not real redirects.” (tłumaczenie) „W skrócie Googlebot nie wchodzi z nimi w interakcję; te przekierowania 307 zasadniczo nie są prawdziwymi przekierowaniami.” Tak czy inaczej crawler nie widzi tego samego „307”, który człowiek widzi w narzędziach deweloperskich — zmieniły się narzędzia i infrastruktura crawlowania (Fetch as Google wycofano na rzecz URL Inspection), ale podstawowy punkt utrzymywał się co najmniej przez dekadę: w przypadku HSTS nie ma prawdziwego 307 wydanego przez serwer. Traktuj wypowiedź z 2020 r. jako bieżące wytyczne, a tę z 2015 r. jako historię.

Najważniejszy wniosek operacyjny: HSTS to wygoda przeglądarki, a nie mechanizm odkrywania adresów przez crawlery. Właściciele witryn nadal potrzebują prawdziwego przekierowania po stronie serwera (autentycznego 301) z HTTP do HTTPS, jeśli ta ścieżka ma działać dla crawlerów.

Jak Bing traktuje 307

Szczerze? Istnieje luka w dokumentacji. Nie znalazłem publicznej wypowiedzi Binga, która odnosiłaby się z nazwy do 307 albo konkretnie do 307 wywołanego przez HSTS. Wytyczne Binga dotyczące przekierowań (wpis z 2011 r. Zarządzanie przekierowaniami — 301, 302 i kanoniczne adresy URL oraz wpis z 2020 r. Migracja witryny z Bingiem) obejmują tylko podział 301/302 na stały i tymczasowy — bez wzmianki o 307, 308 czy HSTS. Zamiast zakładać zgodność z Google, ujmij to wprost: Bing publicznie nie powiedział nic specyficznego o 307. Zjawisko nadal jest prawdziwe i istotne dla crawlerów niezależnie od wyszukiwarki — Screaming Frog ma przełącznik „Respect HSTS Policy” właśnie dlatego, że HSTS wpływa na crawlowanie — ale to dokumentacja narzędzia, a nie wypowiedź Binga.

Kiedy celowo wybrać 307

Wybierz 307 zamiast 302 zawsze, gdy utrata oryginalnej metody lub ciała zepsułaby działanie:

  • Endpointy API i cele webhooków, które odbierają POST/PUT/PATCH.
  • Przepływy wysyłania formularzy (POST), które przekierowują po przetworzeniu.
  • Przekazania POST-u w checkoutach lub logowaniu między hostami.
  • Wszystko, gdzie żądanie niesie ciało, którego nie możesz utracić.

Przy zwykłym przeniesieniu strona–strona 302 i 307 są dla Google nie do odróżnienia, więc pod kątem SEO oba są poprawne. Jeśli zajmujesz się stałą wersją tej samej logiki zachowywania metody, chodzi o relację 301 kontra 308 — 308 ma się do 301 tak, jak 307 do 302.

Moja własna preferencja, opisana w poradniku o przekierowaniach, jest bardziej zdecydowana niż zwykłe „to nie ma znaczenia”: “my preferred order would be: 307 / 302 / 303 > Meta refresh 0 / HTTP refresh 0.” (tłumaczenie) „moja preferowana kolejność to: 307 / 302 / 303 > Meta refresh 0 / HTTP refresh 0.” Stawiam 307 na pierwszym miejscu wśród opcji tymczasowych — konsekwentne używanie go daje bezpieczeństwo w kwestii zachowania metody, co z grubsza odpowiada argumentowi o „kompletności” Muellera. Niezależnie od wyboru pilnuj, aby prawdziwy 307 (albo artefakt HSTS) nie stał się jednym z przeskoków w dłuższym łańcuchu przekierowań — każdy dodatkowy przeskok to opóźnienie i utracona efektywność.

Try it live

This is a real endpoint on this site — not a simulation. Hit it from the button, open it in a new tab, or curl -i it from your terminal, and the server answers with the actual status code this article is about.

Open in new tab ↗

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.