Jak działa ta kontrola
Scanaris żąda Twojej strony przez http://, bez s, nie podążając za przekierowaniami, i patrzy, co odpowiada serwer. Jeśli zwraca kod przekierowania (301, 302, 307 lub 308) na adres https://, wszystko w porządku. Jeśli odpowiada 200 i serwuje stronę jawnym tekstem, otwiera ustalenie o średniej wadze: niezaszyfrowana wersja Twojej strony istnieje i działa. Jeśli przekierowuje, ale cel to nadal http:// (na przykład z roota na http://www), otwiera ustalenie o niskiej wadze: łańcuch przekierowań ma niezaszyfrowane ogniwo. Testowany jest tylko skanowany adres; zachowanie powinno być takie samo na wszystkich ścieżkach, nie tylko na stronie głównej.
Dlaczego to ważne
Dopóki wersja HTTP odpowiada, każdy stary link, każdy adres wpisany ręcznie i każda publiczna sieć może zaprowadzić użytkownika na Twoją stronę bez szyfrowania. W tym stanie ten, kto kontroluje sieć (wifi na lotnisku, złośliwy dostawca), czyta to, co jest wysyłane, i może zmodyfikować stronę, zanim dotrze. To podstawa ataków man-in-the-middle. Przekierowanie 301 na HTTPS zamyka te drzwi przy pierwszym żądaniu, a HSTS zamyka je dla wszystkich kolejnych.
Jak to naprawić w zależności od hostingu
- Vercel, Netlify, Cloudflare Pages, Railway, Render: przekierowanie jest włączone fabrycznie. Jeśli widzisz ustalenie, domena zwykle wskazuje na inny serwer albo proxy przed nim odpowiada przez HTTP.
- Cloudflare jako proxy: włącz „Always Use HTTPS" i ustaw tryb SSL na „Full (strict)". Przy „Flexible" odcinek między Cloudflare a Twoim serwerem idzie jawnym tekstem.
- nginx:
server {
listen 80;
server_name twojadomena.pl www.twojadomena.pl;
return 301 https://$host$request_uri;
}
- Apache: w VirtualHost portu 80,
Redirect permanent / https://twojadomena.pl/. - Express za proxy: middleware, który sprawdza
req.headers['x-forwarded-proto'] !== 'https'i odpowiadares.redirect(301, 'https://' + req.headers.host + req.url), zapp.set('trust proxy', 1).
Użyj 301 lub 308 (stałych), a nie 302: wyszukiwarki konsolidują autorytet na wersji HTTPS, a przeglądarki zapamiętują skok. Potem dodaj nagłówek HSTS, który mierzy kontrola słaby HSTS, żeby przeglądarka następnym razem nawet nie próbowała HTTP.
Sprawdź, czy naprawione
curl -sI http://twojadomena.pl | grep -iE "^HTTP|^location"
curl -sI http://twojadomena.pl/dowolna-strona | grep -iE "^HTTP|^location"
curl -sI http://www.twojadomena.pl | grep -iE "^HTTP|^location"
Wszystkie trzy muszą odpowiedzieć 301 lub 308 z nagłówkiem Location zaczynającym się od https://. Jeśli drugie nie przekierowuje, Twoja reguła obejmuje tylko stronę główną.
Często zadawane pytania
Czy nie wystarczy mieć włączone HTTPS?
Nie. Posiadanie certyfikatu oznacza, że bezpieczna wersja istnieje; przekierowanie oznacza, że niebezpieczna nie jest używana. Bez niego obie współistnieją.
Dlaczego 301, a nie 302?
302 jest tymczasowe: przeglądarki za każdym razem ponownie żądają wersji HTTP, a wyszukiwarki nie przenoszą autorytetu. 301 (lub 308, które dodatkowo zachowuje metodę) to sygnał, że zmiana jest ostateczna.
Moje API nie potrzebuje HTTPS, korzysta z niego tylko moja aplikacja.
Potrzebuje: przez to API przechodzą tokeny i dane Twoich użytkowników. A jeśli aplikacja wywołuje je przez HTTP ze strony HTTPS, przeglądarka zablokuje je jako mieszaną treść.