Dokumentacja
Przekieruj HTTP na HTTPS
Przekieruj HTTP na HTTPS
Odwiedzający rzadko wpisują https://. Wpisują example.com, klikają stary link albo otwierają zakładkę sprzed lat, a przeglądarka zaczyna od http://. Jeśli serwer odpowiada na takie żądanie od razu stroną, wizyta przebiega bez szyfrowania: hasła, dane z formularzy i ciasteczka idą otwartym tekstem, a przeglądarka oznacza stronę jako Niezabezpieczona. Google widzi przy tym dwie kopie każdej strony, po jednej na każdym protokole.
Rozwiązaniem jest jedno stałe przekierowanie: każdy adres http:// odpowiada kodem 301 (lub 308) i wskazuje ten sam adres na https://. Lista kontrolna strony traktuje brak przekierowania jako krytyczny.
Czego oczekuje lista kontrolna
Odpowiedź na http:// |
Wynik |
|---|---|
301 lub 308 na https://… |
OK |
302, 303 lub 307 na https://… |
ostrzeżenie: przekierowanie jest tymczasowe, więc wyszukiwarki zachowują adres http:// |
200 ze stroną albo przekierowanie gdzie indziej |
błąd: strona jest serwowana bez szyfrowania |
| port 80 zamknięty | informacja: http:// w ogóle się nie otwiera, więc nic nie wycieka, ale odwiedzający, którzy wpiszą sam adres, dostają błąd |
Przekierowanie powinno prowadzić prosto do docelowego adresu. http://example.com → https://example.com/ to jeden skok. Łańcuch typu http://example.com → http://www.example.com → https://www.example.com marnuje czas przy każdej pierwszej wizycie (zobacz Jeden adres, z www lub bez).
Sprawdź sam
Zamiast example.com wpisz swoją stronę:
curl -sI http://example.com | grep -iE '^(HTTP|location)'
curl -sI http://example.com/some/page?x=1 | grep -iE '^(HTTP|location)'
Po naprawie wygląda to tak, w drugim przypadku z zachowaną ścieżką i parametrami:
HTTP/1.1 301 Moved Permanently
Location: https://example.com/
Jeśli pierwsza linia mówi 200, przekierowania nie ma. Jeśli 302 lub 307, przekierowanie jest tymczasowe.
Jak to naprawić
Najpierw potrzebujesz ważnego certyfikatu na https://; przekierowanie na wadliwy certyfikat zablokuje wszystkich odwiedzających. Potem wybierz to, do czego masz dostęp. Ustaw przekierowanie tylko w jednym miejscu: dwie warstwy, które obie przekierowują (na przykład Cloudflare i .htaccess), to źródło pętli.
WordPress
- W Settings → General ustaw WordPress Address (URL) i Site Address (URL) na
https://example.com. Potem zaloguj się ponownie. - Sam WordPress nie przekierowuje z
http://nahttps://. Dodaj przekierowanie na poziomie hostingu (zakładka cPanel, Plesk lub.htaccess) albo darmową wtyczką Really Simple SSL (obecnie Really Simple Security): po aktywacji włącz SSL i jej przekierowanie. Jeśli oferuje przekierowanie 301 w.htaccess, wybierz je zamiast przekierowania w PHP: jest szybsze i obejmuje też obrazy i pliki. - Wyczyść pamięć podręczną stron (WP Rocket, LiteSpeed Cache, cache hostingu).
Jeśli oba pola adresów są wyszarzone, są ustawione w wp-config.php (WP_HOME i WP_SITEURL); zmień je tam.
cPanel
- Upewnij się, że domena ma certyfikat: Security → SSL/TLS Status musi pokazywać ją jako objętą (AutoSSL u większości hostingów wystawia go za darmo).
- Otwórz Domains → Domains.
- Przy domenie włącz Force HTTPS Redirect.
Jeśli przełącznika brak albo jest wyszarzony, dodaj regułę z zakładki Apache do .htaccess w katalogu głównym strony (File Manager, z włączonym Show Hidden Files).
Plesk
- W Websites & Domains → example.com → SSL/TLS Certificates upewnij się, że jest zainstalowany ważny certyfikat (Let's Encrypt jest darmowy).
- Otwórz Websites & Domains → example.com → Hosting & DNS → Hosting (w starszych wersjach Pleska Hosting Settings).
- W sekcji Security sprawdź, czy SSL/TLS support jest włączone i certyfikat wybrany, a potem włącz Permanent SEO-safe 301 redirect from HTTP to HTTPS.
- Kliknij OK (lub Apply).
DirectAdmin
- Upewnij się, że domena ma certyfikat: Account Manager → SSL Certificates (Let's Encrypt jest darmowy).
- Otwórz Account Manager → Domain Setup i kliknij domenę.
- Włącz Force SSL with https redirect i zapisz.
nginx
Daj portowi 80 osobny blok server, który tylko przekierowuje. Znajduje się w pliku Twojej strony: /etc/nginx/sites-available/example.com na Debianie i Ubuntu, /etc/nginx/conf.d/example.com.conf na Rocky, Alma i CentOS.
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://example.com$request_uri;
}
W linii return wpisz swój główny adres (z www lub bez), żeby oba warianty trafiały do niego jednym skokiem. Usuń z tego bloku root, location i ustawienia PHP: na porcie 80 nie powinien niczego serwować.
sudo nginx -t && sudo systemctl reload nginx
Jeśli używasz Certbota, równoważny blok doda sudo certbot --nginx --redirect -d example.com -d www.example.com.
Apache i LiteSpeed
Z dostępem do serwera (Apache). W wirtualnym hoście dla portu 80 (/etc/apache2/sites-available/example.com.conf na Debianie i Ubuntu, plik w /etc/httpd/conf.d/ na Rocky, Alma i CentOS):
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Redirect permanent / https://example.com/
</VirtualHost>
sudo apachectl configtest && sudo systemctl reload apache2
(Na Rocky, Alma i CentOS httpd zamiast apache2.)
Bez dostępu do serwera (hosting współdzielony, LiteSpeed). Umieść to na początku pliku .htaccess w katalogu głównym strony, nad blokiem # BEGIN WordPress, jeśli istnieje:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Linia z X-Forwarded-Proto zapobiega pętli, gdy proxy lub CDN przed serwerem rozmawia z odwiedzającym już po HTTPS, a z Twoim serwerem po zwykłym HTTP.
Cloudflare
- Otwórz domenę i przejdź do SSL/TLS → Overview. Ustaw tryb szyfrowania na Full (strict) (Twój serwer potrzebuje ważnego certyfikatu; darmowy Cloudflare Origin Certificate też działa).
- Przejdź do SSL/TLS → Edge Certificates i włącz Always Use HTTPS. Cloudflare odpowiada na każde żądanie
http://kodem301nahttps://.
Ostrzeżenie: Nie łącz trybu Flexible z przekierowaniem na serwerze. W trybie Flexible Cloudflare łączy się z Twoim serwerem zwykłym HTTP, serwer przekierowuje na HTTPS, Cloudflare znowu pyta po HTTP, a przeglądarka zatrzymuje się z błędem too many redirects. Użyj Full (strict) albo zostaw przekierowanie wyłącznie Cloudflare.
IIS i ASP.NET
Zainstaluj moduł URL Rewrite dla IIS, a potem dodaj tę regułę do web.config strony:
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="HTTP to HTTPS" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="^OFF$" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
redirectType="Permanent" wysyła 301. Strona potrzebuje też powiązania http na porcie 80, inaczej żądanie w ogóle nie dotrze do reguły.
W ASP.NET Core app.UseHttpsRedirection() domyślnie przekierowuje tymczasowym 307. Ustaw stałe:
builder.Services.AddHttpsRedirection(options =>
{
options.RedirectStatusCode = StatusCodes.Status308PermanentRedirect;
});
Platformy hostowane
Shopify, Wix, Squarespace i Webflow same wystawiają certyfikat i przekierowują http:// na https://, gdy domena jest podłączona. Jeśli lista kontrolna zgłasza tam problem, sprawdź, czy domena jest podłączona w ustawieniach domen platformy (a nie tylko na nią skierowana) i czy opcja SSL platformy jest włączona.
Potwierdź poprawkę
Uruchom ponownie polecenia curl z sekcji Sprawdź sam, potem otwórz cel w PulseKeeper i kliknij Sprawdź teraz na zakładce Lista kontrolna. Jeśli chcesz, żeby przeglądarki od drugiej wizyty w ogóle pomijały http://, następnym krokiem jest HSTS.