Jak zrobić przekierowanie HTTPS — .htaccess, Nginx, WordPress | WebMajka

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 i https://, 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);
Przekierowanie HTTPS — schemat działania redirectu 301 na SSL
Przekierowanie HTTPS — schemat działania redirectu 301 na SSL

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łądPrzyczynaRozwiązanie
Mixed ContentLinki do obrazów/skryptów po HTTPSearch-Replace w bazie, zmiana w motywie
Redirect loopSprzeczne reguły w .htaccess i paneluUsuń duplikaty, użyj X-Forwarded-Proto
Błąd SSL: ERR_CERT_COMMON_NAMECertyfikat wystawiony na inną domenęWystaw nowy na właściwą nazwę
Strona wolno się ładujeBrak HTTP/2 na serwerzeWłącz w konfiguracji Nginx/Apache
Błąd 525 CloudflareBrak SSL na origin serwerzeWłącz SSL lub Full (strict) w CF
Zresetowane sesje użytkownikówCookies bez flagi SecureDodaj 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.com powinno zwrócić HTTP/1.1 301 Moved Permanently i Location: 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?
Nie. Certyfikat SSL tylko umożliwia połączenie HTTPS, ale nie wymusza go. Bez przekierowania 301 strona działa zarówno pod 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?
To typowy problem mixed content — zasoby (obrazy, CSS, JS) nadal ładowane są po HTTP i przeglądarka je blokuje. Rozwiązanie: wtyczka Better Search Replace (WordPress) zamienia wszystkie http://twojadomena.pl na https://twojadomena.pl w bazie. Sprawdź konsolę deweloperską (F12) dla dokładnej listy.
Czy przekierowanie HTTPS wpływa na SEO?
Tak, pozytywnie. HTTPS jest oficjalnym czynnikiem rankingowym Google od 2014 roku. Kluczowe: używaj przekierowania 301 (nie 302), żeby Google przekazał wartość SEO starej wersji HTTP na nową HTTPS. Prawidłowa migracja nie powoduje spadku pozycji.
Co to jest HSTS i czy muszę go włączyć?
HSTS to nagłówek, który mówi przeglądarce: łącz się z tą stroną tylko po HTTPS przez X czasu. Chroni przed atakami podmiany pierwszego żądania HTTP. Nie jest obowiązkowy, ale znacznie zwiększa bezpieczeństwo. Uważaj — po ustawieniu trudno go cofnąć, zacznij od krótkiego max-age.
Czy Let's Encrypt wystarczy, czy muszę kupić płatny SSL?
Dla 95% stron Let's Encrypt wystarczy — darmowy, automatycznie odnawialny co 90 dni, ta sama kryptografia co płatne. Płatny SSL ma sens tylko dla: EV SSL (pokazuje nazwę firmy w pasku), Wildcard dla wielu subdomen, SSL gwarantowany dla banków i e-commerce zgodnych z PCI DSS.
Po zmianie na HTTPS wylogowani zostają użytkownicy — dlaczego?
Sesje przechowywane w cookies bez flagi Secure nie są automatycznie przenoszone między HTTP a HTTPS. Po migracji wszyscy zalogowani użytkownicy zostają wylogowani — to normalne, zdarza się raz. Dodaj flagi Secure i HttpOnly do cookies, żeby zwiększyć bezpieczeństwo.
Jak długo trwa przekierowanie HTTP na HTTPS?
Sama zmiana w .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.

Przeczytaj również