Kod Statusu HTTP 302 (302 Found): Co Oznacza i Kiedy Używać

Advertisement
Czym Jest Kod Statusu HTTP 302?
Kod statusu HTTP 302 — oficjalnie nazwany 302 Found — to kod odpowiedzi HTTP informujący klienta (zwykle przeglądarkę), że żądany zasób został tymczasowo przeniesiony pod inną URL. Nowa URL jest podana w nagłówku Location odpowiedzi, a klient ma pobrać zasób stamtąd tylko dla tego żądania.
Ponieważ przeniesienie jest tymczasowe, klient powinien nadal używać oryginalnej URL w przyszłych żądaniach. Wyszukiwarki, przeglądarki i zakładki nie powinny zastępować oryginalnej URL celem przekierowania. To kluczowa różnica behawioralna między HTTP 302 a 301 Moved Permanently.
Kod 302 należy do klasy 3xx przekierowań kodów statusu HTTP, zdefiniowanej w RFC 9110. Mimo historycznej nazwy 'Found' treść odpowiedzi jest prawie nigdy nieużywana — nowoczesne przeglądarki natychmiast podążają za nagłówkiem Location bez renderowania jej.
Anatomia Odpowiedzi 302
Odpowiedź z kodem statusu HTTP 302 zawsze zawiera dwa kluczowe elementy: linię statusu i nagłówek Location wskazujący nową URL. Bez prawidłowego nagłówka Location klient nie może podążyć za przekierowaniem.
Linia statusu —
HTTP/1.1 302 Found(lubHTTP/2 302w HTTP/2)Nagłówek Location — docelowa URL, którą klient ma podążyć (wymagany)
Cache-Control — zwykle
no-cache, aby przeglądarki nie cache'owały celu przekierowania trwaleBody — zazwyczaj puste, choć serwery mogą dołączyć małą stronę HTML dla starszych klientów (
<html><body><a href="...">Kliknij tutaj</a></body></html>)
HTTP/1.1 302 Found
Location: https://www.example.com/new-page
Content-Type: text/html; charset=UTF-8
Content-Length: 0
Cache-Control: no-cache, no-store
Date: Mon, 27 Apr 2026 14:00:00 GMTNagłówek Location może być URL absolutną (https://example.com/path) lub względną do ścieżki (/path). Nowoczesne klienty HTTP akceptują oba, choć URL absolutne są zalecane dla jasności.
302 vs 301 vs 307 vs 308: Które Przekierowanie Wybrać?
HTTP definiuje pięć powszechnych kodów statusu przekierowań, a wybór właściwego ma znaczenie dla cache, SEO i zachowania metody żądania. Użyj tej tabeli jako matrycy decyzyjnej:
| Kod | Trwałość | Metoda zachowana? | Cache'owany przez przeglądarki? | Najlepsze do |
|---|---|---|---|---|
| 301 Moved Permanently | Trwały | Może zmienić POST→GET | Tak (agresywnie) | Trwałe zmiany URL, migracje domen |
| 302 Found | Tymczasowy | Często zmienia POST→GET | Nie | Logowanie, testy A/B, konserwacja |
| 303 See Other | Tymczasowy | Zawsze zmienia na GET | Nie | Wzorzec POST/Redirect/GET po wysłaniu formularza |
| 307 Temporary Redirect | Tymczasowy | Tak — zachowana | Nie | Przekierowania tymczasowe wymagające zachowania POST/PUT |
| 308 Permanent Redirect | Trwały | Tak — zachowana | Tak | Przekierowania trwałe wymagające zachowania POST/PUT |
Współczesna rekomendacja: jeśli potrzebujesz przekierowania tymczasowego i chcesz być jednoznaczny w obsłudze metody, użyj 307 zamiast 302. Kod 307 został dodany w HTTP/1.1 właśnie dlatego, że przeglądarki historycznie naruszały specyfikację, zmieniając POST na GET przy 302 — i ta niewłaściwa praktyka stała się tak powszechna, że została de facto standardem.
Kiedy Używać Przekierowania 302?
Używaj kodu statusu HTTP 302 zawsze, gdy przekierowanie jest naprawdę tymczasowe — to znaczy gdy planujesz w przyszłości usunąć lub zmienić cel przekierowania. Powszechne legalne przypadki użycia:
Przekierowania logowania — Wysyłanie nieuwierzytelnionego użytkownika z
/dashboarddo/login, a po zalogowaniu z powrotemTesty A/B — Kierowanie 50% użytkowników do wariantu bez zmiany URL kanonicznego
Strony konserwacji — Tymczasowe przekierowanie całego ruchu do
/maintenancepodczas łatania serweraRouting geograficzny — Wysyłanie odwiedzających z
/do/pllub/usw zależności od kraju, zachowując/jako wejście kanonicznePrzekierowania mobilne — Przekierowanie użytkowników smartfonów z
example.comdom.example.com(dziś preferowany jest design responsywny)Strony produktów bez stocku — Wysyłanie kupujących do kategorii do czasu powrotu produktu
Krótkotrwałe URL promocyjne —
/black-fridayprzekierowujące do strony kampanii tylko podczas promocji
Jeśli któryś z tych przypadków stanie się trwały, przełącz na 301. Wyszukiwarki czekają kilka miesięcy, zanim długotrwały 302 potraktują jako 301, więc pozostawienie trwałego przeniesienia w 302 kosztuje sygnały rankingowe podczas tego okresu.
Advertisement
Jak Wysłać Kod Statusu 302
Większość serwerów webowych i frameworków ma wbudowane helpery do wysyłania przekierowania 302. Poniżej najczęstsze wzorce. Każdy wysyła HTTP 302 Found z nagłówkiem Location — jedyne dwie rzeczy, których ściśle wymaga odpowiedź 302.
Nginx
W Nginx użyj dyrektywy return z kodem 302 (domyślnie też 302, jeśli pominiesz kod):
server {
listen 80;
server_name example.com;
# Tymczasowe przekierowanie (302 Found)
location /old-page {
return 302 https://example.com/new-page;
}
}Apache (.htaccess)
W Apache użyj Redirect z kodem 302 lub RewriteRule z flagą [R=302,L]:
# Proste tymczasowe przekierowanie
Redirect 302 /old-page https://example.com/new-page
# Lub z mod_rewrite dla dopasowywania wzorców
RewriteEngine On
RewriteRule ^maintenance$ /maintenance.html [R=302,L]Node.js (Express)
Metoda res.redirect() Expressa domyślnie używa 302, gdy kod nie jest podany:
// Tymczasowe przekierowanie (302 Found domyślnie)
app.get('/dashboard', (req, res) => {
if (!req.user) {
return res.redirect('/login') // wysyła 302
}
// ...renderuj dashboard
})
// Lub jawnie:
res.redirect(302, '/login')Jak Przetestować Kod Statusu 302
Po zaimplementowaniu przekierowania 302 zweryfikuj, czy działa poprawnie. Najszybszym sposobem jest curl z terminala — pokazuje dokładny kod statusu i nagłówek Location bez ingerencji cache przeglądarki.
# Pokaż tylko nagłówki odpowiedzi (-I) bez podążania za przekierowaniem
curl -I https://example.com/old-page
# Oczekiwane wyjście:
# HTTP/2 302
# location: https://example.com/new-page
# cache-control: no-cache
# date: Mon, 27 Apr 2026 14:00:00 GMT
# Podążaj za pełnym łańcuchem (-L) i pokaż każdy skok
curl -ILs https://example.com/old-page | grep -i 'HTTP/\|location:'Jeśli nie masz dostępu do terminala, użyj darmowego Sprawdzacza Przekierowań DNS Robot, aby prześledzić cały łańcuch z neutralnej lokalizacji, lub Sprawdzacza Nagłówków HTTP do sprawdzenia surowych nagłówków odpowiedzi — oba omijają cache przeglądarki.
Przekierowania 302 a SEO
Kod statusu HTTP 302 mówi wyszukiwarkom: 'to przeniesienie jest tymczasowe, zachowajcie oryginalną URL w indeksie.' To ma bezpośrednie konsekwencje dla sygnałów rankingowych.
Według Google Search Central, 302 nie przenosi sygnałów rankingowych z oryginalnej URL na cel przekierowania w sposób, w jaki robi to 301. Oryginalna URL pozostaje kanoniczna. Google może nadal indeksować stronę docelową, jeśli inne sygnały kanonikalizacji (linki wewnętrzne, sitemap, hreflang) wskazują na nią — ale samo 302 nie jest sygnałem kanonicznym.
Używaj 301 do trwałych przeniesień — Zmiany domen, zmiany struktury URL, konsolidacja stron
Używaj 302 do tymczasowych przeniesień — Logowanie, testy A/B, konserwacja, routing regionalny
Nie zostawiaj trwałego przeniesienia w 302 — Google czeka miesiącami, zanim długotrwały 302 potraktuje jako 301, kosztując equity rankingu
Unikaj łańcuchów —
A → 302 → B → 302 → Crozcieńcza sygnały i spowalnia ładowanie. Każdy skok dodaje opóźnienie
Dlaczego 302 Zmienia Żądania POST na GET
To najbardziej zaskakujące zachowanie HTTP 302. Oryginalny RFC mówił, że klienci powinni zachować metodę żądania podczas podążania za przekierowaniem. Ale wczesne przeglądarki — Mosaic, Netscape, IE — wszystkie zmieniły POST na GET przy 302, a to niewłaściwe zachowanie stało się tak powszechne, że zostało ustandaryzowane w WHATWG Fetch Standard.
Dziś, gdy przeglądarka wysyła POST /login i serwer odpowiada 302 Found, przeglądarka automatycznie wysyła GET /next-page do celu przekierowania. Dane formularza są tracone. To rzadko jest tym, co zamierzają deweloperzy serwera.
# Co wysyłasz:
POST /submit-form HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
name=Alice&email=alice@example.com
# Serwer odpowiada 302:
HTTP/1.1 302 Found
Location: /thank-you
# Przeglądarka podąża z GET (dane formularza tracone!):
GET /thank-you HTTP/1.1
Host: example.comJeśli przekierowanie musi zachować oryginalną metodę (POST pozostaje POST, PUT pozostaje PUT), użyj 307 Temporary Redirect zamiast 302. Jeśli celowo chcesz odrzucić body i przejść na GET — klasyczny wzorzec POST/Redirect/GET — użyj 303 See Other. Oba są jednoznaczne; 302 nie jest.
Advertisement
Częste Problemy z 302 i Jak Je Naprawić
Gdy HTTP 302 idzie nie tak, zwykle pojawia się jako jeden z tych objawów. Większość ma proste rozwiązania:
`Otrzymywanie 302 zamiast 200` — Serwer przekierowuje, gdy nie powinien. Sprawdź
.htaccess, konfigurację Nginx lub middleware frameworka pod kątem niezamierzonych reguł przekierowania`302 bez nagłówka Location` — Nieprawidłowa odpowiedź. Przeglądarki pokażą pustą stronę. Upewnij się, że twój kod ustawia nagłówek
Locationprzed wysłaniem statusu`302 przekierowujące na siebie` — Pętla przekierowań. URL
Locationpasuje do URL żądania. Sprawdź regułę pod kątem brakujących warunków`302 odrzucające dane formularza` — POST → 302 → GET odrzuca body. Przełącz na
307 Temporary Redirect, aby zachować POST`302 cache'owane przez przeglądarkę` — Buggy serwer ustawił
Cache-Control: max-age=...na przekierowaniu. DodajCache-Control: no-cachei wyczyść cache`302 w produkcji, ale nie lokalnie` — Zwykle CDN lub load balancer dodający przekierowania. Testuj bezpośrednio przeciwko origin, aby wyizolować
Pętle Przekierowań 302: Jak Zdiagnozować
Pętla przekierowań występuje, gdy URL A zwraca 302 do URL B, a URL B zwraca 302 z powrotem do A. Po 20 skokach (w Chrome i Firefox) przeglądarka pokazuje ERR_TOO_MANY_REDIRECTS i się poddaje.
Najczęstszą pojedynczą przyczyną jest konflikt SSL/HTTPS między CDN (jak Cloudflare) a serwerem origin: CDN łączy się z origin przez HTTP, origin przekierowuje HTTP→HTTPS, CDN usuwa HTTPS i łączy się przez HTTP ponownie — nieskończona pętla.
# Prześledź pełny łańcuch (ogranicz do 10 skoków, by uniknąć nieskończonych pętli)
curl -ILs --max-redirs 10 https://example.com 2>&1 | grep -i 'HTTP/\|location:'
# Przykład pętli:
# HTTP/2 302
# location: http://example.com/
# HTTP/1.1 302 Found
# Location: https://example.com/
# HTTP/2 302
# location: http://example.com/ <-- pętla potwierdzonaJeśli widzisz dwie URL na przemian w nagłówkach Location, potwierdziłeś pętlę 302. Pełny przewodnik znajdziesz w naszym poście ERR_TOO_MANY_REDIRECTS. Sprawdzacz Przekierowań DNS Robot prześledza cały łańcuch z neutralnej lokalizacji i zatrzymuje się w punkcie pętli.
Najlepsze Praktyki dla Kodu Statusu 302
Wysyłanie 302 Found poprawnie unika większości błędów, na które natrafiają deweloperzy implementując przekierowania:
Zawsze dołączaj nagłówek Location —
302bezLocationjest nieprawidłowy i renderuje się jako pusta stronaZawsze ustawiaj Cache-Control: no-cache — Inaczej niektóre przeglądarki cache'ują przekierowanie na czas sesji, łamiąc kontrakt 'tymczasowy'
Używaj URL absolutnych w Location —
https://example.com/newjest jednoznaczne;/newdziała, ale może się zepsuć za proxy zmieniającymi hostTrzymaj przekierowania w jednym skoku —
A → 302 → Bjest ok;A → 302 → B → 302 → Cspowalnia ładowanie i rozcieńcza sygnałyNie przekierowuj z POST na inną stronę przez 302 — Użyj
303(intencjonalny GET) lub307(zachowaj POST)Audytuj przekierowania co miesiąc — Stare tymczasowe przekierowania często przeżywają swój powód. Sprawdzaj Redirect Checker
Przełączaj na 301, gdy przeniesienie staje się trwałe — Nie zostawiaj trwałego przeniesienia w
302dłużej niż kilka tygodni
Zachowanie Przeglądarki i Cache
Różne przeglądarki i pośrednicy obsługują HTTP 302 nieco inaczej. Znajomość tych dziwactw oszczędza czas debugowania:
| Klient | Domyślne zachowanie przy 302 | Domyślny cache |
|---|---|---|
| Chrome / Edge | Auto-podąża, zmienia POST→GET | Nie cache'owany, chyba że nagłówki to powiedzą |
| Firefox | Auto-podąża, zmienia POST→GET | Nie cache'owany, chyba że nagłówki to powiedzą |
| Safari | Auto-podąża, zmienia POST→GET | Nieco bardziej agresywny cache przekierowań |
| curl (domyślnie) | NIE podąża — pokazuje 302 + Location | Brak cache |
| curl -L | Podąża do --max-redirs (domyślnie 50) | Brak cache |
| wget (domyślnie) | Auto-podąża do --max-redirect=20 | Brak cache |
| Googlebot | Podąża, traktuje jako sygnał tymczasowy | Re-crawluje oryginalną URL |
Aby zweryfikować zachowanie przekierowań w przypadkach brzegowych (metody POST, nieskończone pętle, obecność nagłówków), Sprawdzacz Nagłówków HTTP DNS Robot pokazuje surową odpowiedź bez przepisywania metody po stronie przeglądarki. Czytaj więcej o tymczasowych przekierowaniach w dokumentacji MDN i specyfikacji RFC 9110.
Advertisement
Prześledź dowolny łańcuch przekierowań w sekundach
Użyj darmowego Sprawdzacza Przekierowań DNS Robot do inspekcji każdego skoku w łańcuchu przekierowań — kody statusu, nagłówki Location i ostateczny cel z neutralnego serwera (bez cache przeglądarki).
Wypróbuj Sprawdzacz PrzekierowańAdvertisement
Często Zadawane Pytania
Kod statusu 302 (HTTP 302 Found) oznacza, że żądany zasób znajduje się tymczasowo pod inną URL podaną w nagłówku Location odpowiedzi. Klient powinien podążyć za przekierowaniem dla tego żądania, ale nadal używać oryginalnej URL w przyszłych żądaniach. To tymczasowy odpowiednik 301 Moved Permanently.