Przekierowanie HTTP → HTTPS
ważność wysokamierzonysposób redirect
Czy http://domena.pl poprawnie przekierowuje na https://. Brak oznacza, że część użytkowników trafia na wersję nieszyfrowaną.
WIKI
artykuł z 16.09.2026 · źródeł 10Przekierowanie HTTP → HTTPS to parametr monitoringu stron internetowych, który sprawdza, czy żądanie wysłane na adres http:// domeny kończy się pod adresem https://. Pomiar podąża za kolejnymi przekierowaniami i ocenia adres końcowy. Możliwe wyniki to: przekierowanie na HTTPS, brak przekierowania (strona odpowiada przez nieszyfrowane HTTP), błąd połączenia albo brak odpowiedzi w wyznaczonym czasie. Rozróżnienie ma znaczenie, bo według RFC 9110 zasoby udostępniane w schemacie https nie mają wspólnej tożsamości ze schematem http i są osobnymi źródłami (ang. origins) [1].
Jak działa
Odpowiedź z klasy 3xx oznacza, że klient musi wykonać dodatkowe działanie, aby zrealizować żądanie [1]. Kody 301, 302, 307 i 308 wskazują, że zasób może być dostępny pod innym adresem, podanym w nagłówku Location [1]. Gdy odpowiedź zawiera ten nagłówek, przeglądarka może automatycznie powtórzyć żądanie pod nowym adresem, nawet jeśli nie rozpoznaje konkretnego kodu [1].
Kody różnią się trwałością i traktowaniem metody. Kody 301 i 308 oznaczają, że zasób dostał nowy stały adres i przyszłe odwołania powinny używać nowego [1]. Kody 302 i 307 oznaczają przeniesienie tymczasowe, po którym klient powinien dalej używać adresu pierwotnego [1]. Z przyczyn historycznych przeglądarka może po odpowiedzi 301 lub 302 zamienić metodę POST na GET; kody 307 i 308 dodano właśnie po to, by jednoznacznie zachować metodę [1]. Przy zwykłym otwarciu strony, czyli żądaniu GET, 301 i 308 dają ten sam efekt. Różnica wychodzi przy formularzach i interfejsach API, które wysyłają POST na adres http://.
Serwer, który otrzymuje żądanie przez niezabezpieczony kanał, powinien według RFC 6797 odpowiedzieć przekierowaniem stałym, np. 301, z adresem https w nagłówku Location [2]. Nagłówka Strict-Transport-Security nie wolno wysyłać w odpowiedzi przez HTTP [2], więc przeglądarka dostaje go dopiero z odpowiedzią po HTTPS i od tej pory sama zamienia adresy http na https, bez przekierowania [3]. Mechanizm opisuje osobny artykuł HSTS.
Poprawny łańcuch kończy się na jednej formie adresu. Google zaleca wybrać jeden z adresów, pod którymi strona jest dostępna, i przekierować ruch z pozostałych na adres preferowany [5].
Standardy i specyfikacje
- RFC 9110 definiuje klasę 3xx, nagłówek
Locationoraz znaczenie kodów 301, 302, 307 i 308 [1]. - RFC 6797 zaleca przekierowanie stałe z HTTP na HTTPS jako „SHOULD”, a nie „MUST”. Powodem są m.in. ryzyka przekierowań po stronie serwera i witryny z komponentami zewnętrznymi, które mogą przy nich działać niepoprawnie [2].
- Google Search Central: przy przekierowaniu stałym (301, 308) proces indeksowania używa go jako sygnału, że cel powinien być adresem kanonicznym, a przy tymczasowym (302, 307) nie [5]. Gdy adres strony w wynikach ma się zmienić, Google zaleca stałe przekierowanie po stronie serwera [5]. Przekierowanie jest silnym sygnałem kanoniczności [6], a Google preferuje stronę HTTPS przed jej odpowiednikiem HTTP [6].
- Lighthouse w audycie przekierowania zmienia adres strony na HTTP, wczytuje ją i czeka na zdarzenie oznaczające bezpieczną stronę. Brak zdarzenia w ciągu 10 sekund oznacza niezaliczony audyt [7]. Jako naprawę dokumentacja podaje przekierowanie na serwerze i link kanoniczny w nagłówku dokumentu HTML [7].
Zagrożenia i skutki
Pierwsze żądanie bez szyfrowania. Przekierowanie nie chroni samego pierwszego żądania. Gdy użytkownik wpisuje adres http:// albo otwiera taki link, a przeglądarka nie zna jeszcze polityki HSTS hosta, pierwsza wymiana idzie niezabezpieczonym kanałem i jest podatna na ataki [2]. MDN wskazuje tę samą słabość HSTS i podaje listę preload jako sposób jej ograniczenia [3]. Znanym przykładem jest atak SSL stripping, dla którego Moxie Marlinspike opublikował narzędzie typu man-in-the-middle o nazwie sslstrip [4].
Brak przekierowania. Strona dostępna jednocześnie pod http:// i https:// ma dwa osobne źródła [1], a wersja HTTP działa bez ochrony transportu. Dokumentacja Lighthouse przyjmuje, że każda witryna powinna być chroniona przez HTTPS [7].
Przekierowanie tymczasowe. Kody 302 i 307 nie wskazują adresu kanonicznego, więc w wynikach wyszukiwania może zostać adres źródłowy [5].
Łańcuch przez HTTP i sprzeczne sygnały. Google nie daje pierwszeństwa stronie HTTPS, gdy ma ona nieważny certyfikat, przekierowuje użytkownika do strony HTTP lub przez nią albo wskazuje wersję HTTP w rel="canonical" [6].
Szyfrowanie kończone na proxy. Gdy TLS kończy się na load balancerze lub reverse proxy, zmienna %{HTTPS} w Apache zawsze ma wartość off, nawet jeśli klient połączył się przez HTTPS [8]. Reguła oparta na tej zmiennej przekierowuje wtedy również żądania, które były już szyfrowane. Dokumentacja zaleca sprawdzanie nagłówka X-Forwarded-Proto, ale tylko wtedy, gdy administrator kontroluje proxy, bo nagłówek da się podrobić [8].
Przykłady
| Środowisko | Konfiguracja | Uwagi |
|---|---|---|
| Apache, host wirtualny portu 80 | Redirect permanent "/" "https://www.example.com/" | podejście zalecane, bez mod_rewrite [8] |
Apache, plik .htaccess | RewriteCond "%{HTTPS}" !=on i RewriteRule "^(.*)" "https://%{SERVER_NAME}$1" [R=301,L] | gdy brak dostępu do głównej konfiguracji; R=301 to przekierowanie stałe [8] |
| Apache za proxy TLS | RewriteCond "%{HTTP:X-Forwarded-Proto}" =http [NC] | zamiast %{HTTPS}, które za proxy zawsze jest off [8] |
| Apache z klientem ACME | wyjątek dla /.well-known/acme-challenge/ przed regułą | walidacja domeny przez zwykłe HTTP [8] |
| nginx | osobny blok server z return 301 i zmienną $request_uri | dokumentacja nazywa to właściwym sposobem zamiast if z rewrite; jej przykład dotyczy nazwy hosta [9] |
| WordPress | stałe WP_HOME i WP_SITEURL z https:// w wp-config.php | nadpisują wartości home i siteurl z tabeli wp_options, nie zmieniając bazy [10] |
- [1] RFC 9110 — HTTP Semantics · IETF
- [2] RFC 6797 — HTTP Strict Transport Security (HSTS) · IETF
- [3] Strict-Transport-Security header · MDN Web Docs
- [4] sslstrip — README · Moxie Marlinspike
- [5] Redirects and Google Search · Google Search Central
- [6] How to specify a canonical URL with rel="canonical" and other methods · Google Search Central
- [7] Does not redirect HTTP traffic to HTTPS — Lighthouse · Chrome for Developers
- [8] Redirecting and Remapping with mod_rewrite — Apache HTTP Server 2.4 · Apache Software Foundation
- [9] Converting rewrite rules · nginx
- [10] Editing wp-config.php — Advanced Administration Handbook · WordPress.org
STATS
wyniki z systemu · tylko liczby zbiorcze- Stron zmierzonych
- 270w ostatnim dniu pomiaru
- OK
- 428odczytów
- Fail
- 57odczytów
- Nie dało się sprawdzić
- 29timeout, blokada, limit zapytań
- Udział fail
- 11,8%bez „nie dało się”
- Stron łącznie
- 272choć jeden odczyt
- OK
- 65327odczytów
- Fail
- 6325odczytów
- Nie dało się sprawdzić
- 6400timeout, blokada, limit zapytań
- Udział fail
- 8,8%bez „nie dało się”
| Dzień | fail | nie dało się sprawdzić | ok |
|---|---|---|---|
| 08.10.2026 | 125 odczytów | 169 odczytów | 1488 odczytów |
| 09.10.2026 | 126 odczytów | 174 odczyty | 1482 odczyty |
| 10.10.2026 | 117 odczytów | 307 odczytów | 1358 odczytów |
| 11.10.2026 | 168 odczytów | 80 odczytów | 1534 odczyty |
| 12.10.2026 | 177 odczytów | 74 odczyty | 1531 odczytów |
| 13.10.2026 | 170 odczytów | 107 odczytów | 1505 odczytów |
| 14.10.2026 | 151 odczytów | 146 odczytów | 1485 odczytów |
| 15.10.2026 | 143 odczyty | 158 odczytów | 1481 odczytów |
| 16.10.2026 | 143 odczyty | 157 odczytów | 1482 odczyty |
| 17.10.2026 | 137 odczytów | 155 odczytów | 1490 odczytów |
| 18.10.2026 | 129 odczytów | 205 odczytów | 1448 odczytów |
| 19.10.2026 | 133 odczyty | 157 odczytów | 1492 odczyty |
| 20.10.2026 | 141 odczytów | 167 odczytów | 1474 odczyty |
| 21.10.2026 | 154 odczyty | 106 odczytów | 1531 odczytów |
| 22.10.2026 | 175 odczytów | 81 odczytów | 1526 odczytów |
| 23.10.2026 | 168 odczytów | 73 odczyty | 1541 odczytów |
| 24.10.2026 | 174 odczyty | 134 odczyty | 1474 odczyty |
| 25.10.2026 | 136 odczytów | 130 odczytów | 1516 odczytów |
| 26.10.2026 | 141 odczytów | 167 odczytów | 1474 odczyty |
| 27.10.2026 | 139 odczytów | 163 odczyty | 1480 odczytów |
| 28.10.2026 | 137 odczytów | 184 odczyty | 1461 odczytów |
| 29.10.2026 | 124 odczyty | 164 odczyty | 1499 odczytów |
| 30.10.2026 | 123 odczyty | 173 odczyty | 1582 odczyty |
| 31.10.2026 | 119 odczytów | 168 odczytów | 1591 odczytów |
| 01.11.2026 | 131 odczytów | 138 odczytów | 1609 odczytów |
| 02.11.2026 | 165 odczytów | 166 odczytów | 1606 odczytów |
| 03.11.2026 | 165 odczytów | 304 odczyty | 1509 odczytów |
| 04.11.2026 | 198 odczytów | 326 odczytów | 1592 odczyty |
| 05.11.2026 | 130 odczytów | 476 odczytów | 1426 odczytów |
| 06.11.2026 | 57 odczytów | 29 odczytów | 428 odczytów |
- Otwarte teraz
- 61stron: 61 · w okresie łaski: 4
- Nowe w ostatnim dniu
- 206.11.2026
- Otwarte od początku
- 518stron: 166
- Zamknięte
- 453od początku
- Mediana trwania
- 12 h 0 minod wykrycia do zamknięcia
| Ustalenie | Skutek | Otwarte teraz | Łącznie | Zamknięte |
|---|---|---|---|---|
| Przekierowanie HTTP → HTTPS redirect | usterka niekrytyczna | 61 | 518 | 453 |
| Dzień | nowe ustalenia |
|---|---|
| 08.10.2026 | 3 ustalenia |
| 09.10.2026 | 2 ustalenia |
| 10.10.2026 | 3 ustalenia |
| 11.10.2026 | 9 ustaleń |
| 12.10.2026 | 12 ustaleń |
| 13.10.2026 | 5 ustaleń |
| 14.10.2026 | 8 ustaleń |
| 15.10.2026 | 6 ustaleń |
| 16.10.2026 | 11 ustaleń |
| 17.10.2026 | 4 ustalenia |
| 18.10.2026 | 2 ustalenia |
| 19.10.2026 | 4 ustalenia |
| 20.10.2026 | 9 ustaleń |
| 21.10.2026 | 7 ustaleń |
| 22.10.2026 | 11 ustaleń |
| 23.10.2026 | 9 ustaleń |
| 24.10.2026 | 5 ustaleń |
| 25.10.2026 | 10 ustaleń |
| 26.10.2026 | 6 ustaleń |
| 27.10.2026 | 7 ustaleń |
| 28.10.2026 | 6 ustaleń |
| 29.10.2026 | 6 ustaleń |
| 30.10.2026 | 5 ustaleń |
| 31.10.2026 | 0 ustaleń |
| 01.11.2026 | 4 ustalenia |
| 02.11.2026 | 7 ustaleń |
| 03.11.2026 | 9 ustaleń |
| 04.11.2026 | 7 ustaleń |
| 05.11.2026 | 1 ustalenie |
| 06.11.2026 | 2 ustalenia |
- Przebiegów
- 60sposób redirect
- W 30 dni
- 0przebiegów
- Ostatni
- 19.09.2026start przebiegu
- Stron w przebiegach
- 20461 przebiegów bez liczby stron
CARD
karta z kodu CREATO_PING, odczyt 22.09.2026Jak ten parametr trafia do ClickUpa: wynik sondy to linia w subtasku 2. Pomiar, a usterka, którą otwiera — linia w subtasku 1. Podsumowanie (z identyfikatorem CWE i kategorią OWASP), skąd liczy się wskaźnik zagrożenia i status strony. Projekcja z bazy skanera odświeża oba subtaski co godzinę. Do 22.09 każde ustalenie dostawało własny subtask i status ze starego słownika (PODATNA, WARNING…) — te słowa zostały jeszcze w części opisów pomiaru niżej jako język wewnętrzny sond.
| Obszar i ważność | Dostępność · wysoka (D05) |
|---|---|
| Workflow i częstotliwość | creato_ping_avail_v2 działa na LAB247Skaner 2.0, rytm „dostepnosc”: premium co 15 min, reszta co 3–12 h · Dawny workflow n8n avail_v2; od 20.09 te same sondy w rytmie kohort skanera. Sposób ssl daje odczyt ssl_expiry (dni do wygaśnięcia certyfikatu); odczyty trafiają do check_results. |
| Sonda i helper | sposób redirect · CREATO_PING/helpers/redirect_check.py |
| Testy |
|
| Typ wyniku | enum: ok / fail / timeout + adres końcowy, liczba przeskoków, znacznik długiego łańcucha, flaga ua_fallback |
| Jednostka | brak — wynik jakościowy (schemat adresu końcowego) |
| Próg i reguła | Timeout 7,0 s, limit 5 przekierowań — stałe w helperze, poza config.py. Reguła: adres końcowy zaczyna się od https://. |
| Gdzie leżą pokrętła | CREATO_PING/helpers/redirect_check.py → _TIMEOUT, _MAX_REDIRECTSCREATO_PING/helpers/common.py → BLOCK_LIKE_STATUSESCREATO_PING/helpers/site_params.py → CRITICAL_CHECK_TYPES (redirect poza listą) |
| Retencja odczytów | Surowy pomiar jako NIEZMIENNY wiersz tabeli `odczyty` w bazie skanera (wejście, wyjście, dowody, sha karty sondy i helpera, commit kodu) — trigger odrzuca każdą zmianę. Okno retencji z kohorty: 90 dni premium, 30 dni reszta; poza oknem zostają odczyty z werdyktem problemu, akcją albo etykietą, bo replay reguł ich potrzebuje (`skaner/retencja.py`). Spłaszczony wynik jedzie dodatkowo do tabeli `check_results` bazy LAB247 (skrzynka `state/checks_outbox` → timer co 10 min); tej tabeli kod LAB247 nie czyści. |
| Znane rozbieżności |
|
| Karta przepisana z | CREATO_PING/helpers/redirect_check.py · CREATO_PING/helpers/common.py · CREATO_PING/helpers/site_params.py · CREATO_PING/helpers/availability_recheck.py · CREATO_PING/tools/avail_writer_input.py · LAB247/site/src/lib/ingest/apply.ts · CREATO_PING/skaner/usterki.toml · CREATO_PING/skaner/ocena.py · odczyt 22.09.2026 |
redirect: bramka polityki otwarta (gate=true) → sprawa w skanerze → Brak przekierowania na HTTPS — waga 2 → ocena 3–4 (niebieski), status strony „niski”, dopóki sprawa jest otwarta. Okres łaski: 1. porażka zakłada sprawę ze statusem IN PROGRESS, której wskaźnik NIE liczy (`ocena.py` pomija sprawy niepotwierdzone), 2. porażka z rzędu potwierdza sprawę i dopiero wtedy usterka wchodzi do oceny. Pierwszy odczyt ok zamyka sprawę. redirect nie jest sprawdzeniem krytycznym: potwierdzona porażka waży tyle, ile ta jedna usterka.
| Kod | Finding | Severity | Pewność | Skutek | Finding / alarm | Waga → ocena | Co zrobić |
|---|---|---|---|---|---|---|---|
| D05.01 | Przekierowanie HTTP → HTTPSredirect | Wysoka | Ewidentne | usterka niekrytyczna | tak / nie | waga 2 → ocena 3–4 (niebieski) | Popraw reguły przekierowań w .htaccess lub w panelu hostingu. |
| Kod i klucz | D05.01 · redirect · w tabeli typów |
|---|---|
| Co znaczy | Brak przekierowania na https lub pętla przekierowań. |
| Kiedy powstaje | GET http://domena z przekierowaniami (maks. 5), limit 7 s. Status fail, gdy końcowy URL nie zaczyna się od https:// (chyba że przy kodzie 403/406/415/429/451 ponowienie z UA przeglądarki kończy się na https), przy pętli przekierowań (TooManyRedirects) albo błędzie sieci. Przekroczenie 7 s to timeout.Więcej niż 2 przeskoki daje chain_warning=True, ale status zostaje ok. |
| Severity · pewność | Wysoka · Ewidentne |
| Skutek dla strony | usterka niekrytyczna · zakłada Finding · alarm nie |
| Waga → ocena | waga 2 → ocena 3–4 (niebieski) |
| Klasyfikacja | CWE: CWE-319 (Cleartext Transmission of Sensitive Information)OWASP Top 10:2025: A04:2025 Cryptographic FailuresOWASP ASVS 5.0.0: 12.2.1OCSF 1.9.0: Compliance Finding (class_uid 2003) |
| Rekord OCSF | finding_info.analytic.uid = "D05.01" · analytic.name = "redirect" · finding_info.types = ["D05 Przekierowanie HTTP → HTTPS"] |
| Co zrobić | Popraw reguły przekierowań w .htaccess lub w panelu hostingu. |
| Wersje typu |
|
LOOP
pętli: 1Trafności jeszcze nie liczymy: zamknięcie subtaska nie niesie dziś werdyktu (prawdziwy / fałszywy / nie dało się sprawdzić). Cztery liczby pojawią się, gdy każde zamknięcie dostanie werdykt — to warunek startu pętli 1.
Sygnał: Strony za WAF-em albo wtyczką bezpieczeństwa zwracały sondzie 403/429, a działały dla ludzi — fałszywe DOWN. · dotyczy też: Kod odpowiedzi HTTP, Weryfikacja treści
- 1. Zbiórkaręcznieodczyt z nocnego skanu, bez zapisu per strona
- 2. Werdyktręcznieczłowiek potwierdził, że strona działa w przeglądarce
- 3. Miarabrakliczników trafności wtedy nie było
- 4. Kartabrakkarta parametru powstała 2026-09-16
- 5. Zmianazrobionedruga próba z UA przeglądarki
- 6. Replaybrakbrak zapisanych odczytów do replayu
| Data | Zmiana | Powód | Wpływ na system | Commit · replay |
|---|---|---|---|---|
| 2026-07-19 | Przy kodzie 403, 406, 415, 429 albo 451 sprawdzenie ponawia żądanie z UA przeglądarki; 2xx/3xx za drugim razem = ok (w przekierowaniu: adres końcowy na https).helpers/common.py · helpers/http_check.py · helpers/content_check.py · helpers/redirect_check.py | Blokada robotów na poziomie aplikacji nie jest niedostępnością strony. | cały system Ta sama reguła obowiązuje w weryfikacji treści — oba sprawdzenia czytają BLOCK_LIKE_STATUSES z common.py. | 343b699bez replayubez zapisu zatwierdzenia |