Jak zrobić przekierowanie HTTPS — .htaccess, Nginx, WordPress | WebMajka
Przekierowanie HTTPS — dlaczego jest absolutnie konieczne
HTTPS jak zrobić — to pytanie nadal zadaje wielu właścicieli stron, pomimo że od 2018 roku Google Chrome oznacza witryny bez SSL jako Niezabezpieczone. Samo zainstalowanie certyfikatu SSL nie wystarczy — jeśli strona nadal odpowiada pod http://, użytkownicy i Google widzą dwie różne wersje witryny. Przekierowanie http → https jest koniecznością z kilku powodów:
- Bezpieczeństwo — tylko HTTPS szyfruje dane przesyłane między przeglądarką a serwerem. Bez niego hasła i dane kart są widoczne dla każdego w sieci publicznej.
- SEO — Google oficjalnie traktuje HTTPS jako czynnik rankingowy. Strony bez SSL są w gorszej pozycji.
- Duplikacja treści — jeśli strona działa zarówno pod
http://jak ihttps://, Google widzi to jako dwie identyczne witryny. - Zaufanie użytkowników — zielona kłódka lub brak ostrzeżenia o braku bezpieczeństwa wpływa na konwersję.
- Wymagania przeglądarek — nowe API (geolokalizacja, Service Worker, PWA, Payment API) działają wyłącznie pod HTTPS.
Przekierowanie powinno być typu 301 (Moved Permanently) — Google przekaże wtedy wartość SEO starej wersji HTTP na nową HTTPS. Błąd 302 lub brak przekierowania oznacza utratę pozycji w wyszukiwarce.
Przekierowanie HTTPS w .htaccess (Apache) — uniwersalna metoda
Najpopularniejszy sposób dla serwerów Apache (większość polskich hostingów współdzielonych) to reguła w pliku .htaccess. Otwórz lub utwórz plik .htaccess w katalogu głównym strony (tam, gdzie index.php) i wklej:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Tłumaczenie linia po linii:
RewriteEngine On— włącza moduł rewrite (jeśli dostępny u hostingodawcy).RewriteCond %{HTTPS} off— warunek: wykonaj przekierowanie tylko, gdy HTTPS jest wyłączony.RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]— przekieruj wszystkie adresy (^(.*)$) na wersję HTTPS z zachowaniem domeny (HTTP_HOST) i ścieżki (REQUEST_URI). Flagi: R=301 (stałe przekierowanie), L (ostatnia reguła — nie wykonuj kolejnych).
Alternatywna wersja dla hostingów, które używają load balancera lub reverse proxy (gdy %{HTTPS} nie działa poprawnie):
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Jeśli chcesz jednocześnie przekierować z www na non-www (lub odwrotnie), dodaj drugą regułę:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Więcej o tym pliku w artykule czym jest plik .htaccess.
HTTPS Nginx — konfiguracja w server blocku
Dla serwerów Nginx (popularne w VPS-ach i dedykowanych) konfiguracja wygląda inaczej — nie używa .htaccess, tylko plików konfiguracyjnych w /etc/nginx/sites-available/. Najprostsze przekierowanie:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# reszta konfiguracji strony
}
Pierwszy blok nasłuchuje na porcie 80 (HTTP) i przekierowuje wszystko na HTTPS z kodem 301. Drugi obsługuje właściwy ruch HTTPS. Po zmianie konfiguracji zawsze testuj składnię i restartuj:
sudo nginx -t
sudo systemctl reload nginx
Nginx nie wymaga modułu rewrite, bo instrukcja return 301 jest znacznie szybsza — nie musi parsować URL-a przez silnik wyrażeń regularnych.
WordPress HTTPS — krok po kroku
W WordPressie sama zmiana w .htaccess nie wystarczy — musisz zaktualizować adres strony w bazie danych, inaczej pojawi się błąd mixed content (część zasobów ładuje się po HTTP).
Krok 1: Zaloguj się do panelu WordPress → Ustawienia → Ogólne. Zmień Adres WordPressa (URL) i Adres witryny (URL) z http:// na https://.
Krok 2: Dodaj regułę przekierowania w .htaccess (jak wyżej). WordPress musi ją mieć powyżej bloku # BEGIN WordPress.
Krok 3: Napraw mixed content — wszystkie stare linki do zdjęć, skryptów i arkuszy CSS w bazie danych nadal mogą być pod http://. Użyj wtyczki Better Search Replace lub Velvet Blues Update URLs:
- Search for:
http://twojadomena.pl - Replace with:
https://twojadomena.pl - Zaznacz wszystkie tabele, uruchom.
Krok 4: W wp-config.php dodaj (dla bezpieczeństwa panelu admina pod HTTPS):
define('FORCE_SSL_ADMIN', true);

Krok 5: Wyczyść cache (wtyczki cache, CDN, Cloudflare). Testuj stronę w trybie incognito.
Krok 6: Zgłoś nową wersję strony w Google Search Console jako osobną witrynę (https://example.com).
Przekierowanie HTTPS w PHP — gdy nie możesz użyć .htaccess
Na niektórych hostingach .htaccess jest zablokowany lub mod_rewrite nie jest dostępny. Możesz wtedy wykonać przekierowanie w PHP — najlepiej w najwcześniej ładowanym pliku (np. index.php):
<?php
if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === 'off') {
$redirectUrl = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
header('HTTP/1.1 301 Moved Permanently');
header('Location: ' . $redirectUrl);
exit;
}
Ta metoda jest wolniejsza od .htaccess (każde żądanie uruchamia PHP), ale działa wszędzie. Dla stron za reverse proxy użyj:
if (!isset($_SERVER['HTTP_X_FORWARDED_PROTO']) || $_SERVER['HTTP_X_FORWARDED_PROTO'] !== 'https') {
// przekierowanie jak wyżej
}
HSTS — wzmocnienie przekierowania HTTPS
Samo przekierowanie 301 ma drobną lukę: pierwsze żądanie użytkownika nadal idzie po HTTP — atakujący w sieci może je przechwycić i podmienić. Rozwiązanie to nagłówek HSTS (HTTP Strict Transport Security), który informuje przeglądarkę, żeby przez określony czas łączyła się tylko po HTTPS.
Dodaj w .htaccess:
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</IfModule>
Lub w Nginx:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
Parametry: max-age (czas w sekundach; 31536000 = 1 rok), includeSubDomains (obejmuje subdomeny), preload (gotowe na dodanie do listy Chrome). Uwaga: HSTS jest trudny do cofnięcia — jeśli zdecydujesz się wrócić na HTTP, przeglądarki będą nadal wymuszać HTTPS aż do wygaśnięcia max-age. Zacznij od krótkiego max-age=86400 (1 dzień) i zwiększaj po upewnieniu się, że wszystko działa.
Typowe błędy po przekierowaniu na HTTPS
| Błąd | Przyczyna | Rozwiązanie |
|---|---|---|
| Mixed Content | Linki do obrazów/skryptów po HTTP | Search-Replace w bazie, zmiana w motywie |
| Redirect loop | Sprzeczne reguły w .htaccess i panelu | Usuń duplikaty, użyj X-Forwarded-Proto |
| Błąd SSL: ERR_CERT_COMMON_NAME | Certyfikat wystawiony na inną domenę | Wystaw nowy na właściwą nazwę |
| Strona wolno się ładuje | Brak HTTP/2 na serwerze | Włącz w konfiguracji Nginx/Apache |
| Błąd 525 Cloudflare | Brak SSL na origin serwerze | Włącz SSL lub Full (strict) w CF |
| Zresetowane sesje użytkowników | Cookies bez flagi Secure | Dodaj Secure i HttpOnly do cookies |
Mixed content to najczęstszy problem — przeglądarka blokuje ładowanie zasobów HTTP na stronie HTTPS. Zajrzyj do konsoli deweloperskiej (F12 → Console) — wyświetlą się ostrzeżenia z dokładnymi URL-ami do naprawy.
Weryfikacja poprawności przekierowania HTTPS
Po wdrożeniu koniecznie przetestuj:
- curl z linii komend:
curl -I http://example.compowinno zwrócićHTTP/1.1 301 Moved PermanentlyiLocation: https://example.com/. - SSL Labs (ssllabs.com/ssltest) — kompleksowy test certyfikatu, powinien dać ocenę A lub A+.
- Why No Padlock (whynopadlock.com) — wykrywa problem mixed content.
- Redirect Path (Chrome extension) — pokazuje łańcuch przekierowań dla każdej strony.
- Google Search Console — sprawdź, czy nowe URL-e są indeksowane.
Sprawdź też, czy nie masz łańcuchów przekierowań typu http://example → http://www.example → https://www.example → https://example — każdy hop to utrata milisekund. Najlepsze przekierowanie to pojedynczy skok na finalny URL.
Co po wdrożeniu — rekomendowane kroki
Przekierowanie HTTPS to nie koniec pracy. Zaktualizuj:
- Sitemap.xml — wszystkie URL-e muszą być po HTTPS. Po zmianie mapa strony zostanie ponownie zindeksowana.
- Linki w przekierowaniach 301 — jeśli masz stare redirecty, sprawdź czy prowadzą do wersji HTTPS.
- Canonical URLs — w sekcji
<head>upewnij się, że<link rel="canonical">używa HTTPS. - Google Ads, Facebook Pixel, reklamy — zaktualizuj URL-e landing page.
- Zewnętrzne linki — poproś partnerów biznesowych o aktualizację linków do wersji HTTPS.
W ramach tworzenia stron internetowych i pozycjonowania w WebMajka każda strona jest od razu konfigurowana z HSTS, HTTP/2, poprawnymi przekierowaniami 301 i zamkniętym mixed content — zgodnie ze standardami Google 2026.
Najczęściej zadawane pytania (FAQ)
Czy samo włączenie certyfikatu SSL wystarczy?
http:// jak i https://, co Google traktuje jako duplikat treści. Zawsze dodaj regułę w .htaccess lub konfiguracji serwera.Dlaczego po przełączeniu na HTTPS strona wygląda źle?
http://twojadomena.pl na https://twojadomena.pl w bazie. Sprawdź konsolę deweloperską (F12) dla dokładnej listy.Czy przekierowanie HTTPS wpływa na SEO?
Co to jest HSTS i czy muszę go włączyć?
Czy Let's Encrypt wystarczy, czy muszę kupić płatny SSL?
Po zmianie na HTTPS wylogowani zostają użytkownicy — dlaczego?
Jak długo trwa przekierowanie HTTP na HTTPS?
.htaccess działa natychmiast — od pierwszego requestu. Reindeksacja w Google może trwać 2-8 tygodni — w tym czasie stare URL-e HTTP stopniowo znikają z wyników na rzecz HTTPS. Nowa sitemap w Search Console przyspiesza proces.