Przekierowanie HTTP na HTTPS przez .htaccess (redirect 301)
Odwiedzający wciąż lądują na nieszyfrowanej stronie? Kilka wierszy w pliku .htaccess wystarczy, żeby każde wywołanie HTTP trwale przekierować na HTTPS kodem 301.
Twój serwer wystawia stronę już przez HTTPS, ale odwiedzający wciąż lądują na nieszyfrowanej wersji HTTP? W takim razie brakuje przekierowania. W tym poradniku skonfigurujesz w pliku .htaccess trwałe przekierowanie (kod statusu 301) z HTTP na HTTPS.
Przekierowanie 301 jest właściwym wyborem także pod kątem SEO: wyszukiwarki przenoszą dzięki niemu pozycje starego adresu HTTP na adres HTTPS, zamiast traktować obie wersje jako osobne strony.
Wymagania
- Na twoim serwerze działa Apache. Dla nginx obowiązuje inna konfiguracja, o tym więcej w dalszej części.
- Masz już skonfigurowany ważny certyfikat SSL. Jeśli jeszcze nie, odpowiedni poradnik znajdziesz we wpisie Konfiguracja darmowego certyfikatu SSL z Let's Encrypt.
- Masz dostęp do katalogu strony na swoim serwerze, przez SSH albo przez FTP.
Ważne: przekierowanie konfiguruj dopiero wtedy, gdy HTTPS już działa. Inaczej wyślesz odwiedzających pod adres, który pokazuje ostrzeżenie o certyfikacie.
Włączenie mod_rewrite i zezwolenie na pliki .htaccess
Przekierowanie korzysta z modułu Apache o nazwie mod_rewrite. Włącz go i zrestartuj Apache:
a2enmod rewrite
systemctl restart apache2
Apache w ogóle nie zajrzy do pliku .htaccess, dopóki nie pozwoli na to wpis VirtualHost. Zajrzyj do konfiguracji w katalogu /etc/apache2/sites-available/ i sprawdź, czy dla twojego katalogu ustawione jest AllowOverride All:
<Directory /var/www/MojaDomena.pl>
AllowOverride All
Require all granted
</Directory>
Jeśli jest tam ustawione AllowOverride None, twój plik .htaccess zostanie po cichu zignorowany. Po zmianie w pliku VirtualHost potrzebny jest restart Apache.
Utworzenie pliku .htaccess
Przejdź do katalogu, w którym leży twoja strona:
cd /var/www/<KATALOG-TWOJEJ-STRONY>
Otwórz plik .htaccess w edytorze. Jeśli jeszcze nie istnieje, polecenie go utworzy:
nano .htaccess
Wpisz następujące wiersze. Ten wariant sprawdza wprost, czy połączenie jest szyfrowane, i dokleja do adresu docelowego całą wywołaną ścieżkę:
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Plik zapiszesz kombinacją „CTRL + X”, potem „Y” i „Enter”.
Alternatywa przez port serwera
W starszych konfiguracjach, w których zmienna HTTPS nie jest ustawiana, zadziała zamiast tego sprawdzenie portu:
RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]
Wariant za reverse proxy albo load balancerem
Jeśli przed twoim Apache stoi reverse proxy albo load balancer, który sam kończy szyfrowanie, do Apache dociera żądanie nieszyfrowane. Powyższa reguła wpadłaby wtedy w nieskończoną pętlę. W takim przypadku sprawdzaj nagłówek, który przesyła proxy:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Test przekierowania
Wywołaj swoją domenę w przeglądarce przez http://. Powinno cię od razu przenieść na https://. W wierszu poleceń sprawdzisz kod statusu wprost:
curl -I http://MojaDomena.pl
W odpowiedzi musi pojawić się HTTP/1.1 301 Moved Permanently, a do tego wiersz Location z adresem HTTPS. Jeśli zamiast tego widzisz kod statusu 302, sprawdź, czy w regule naprawdę jest R=301.
Włączenie HSTS (opcjonalnie)
Nagłówkiem HTTP Strict Transport Security każesz przeglądarce, żeby od tej pory w ogóle nie wywoływała twojej domeny przez HTTP. Odpada dzięki temu pierwsze niezabezpieczone wywołanie. Najpierw włącz potrzebny moduł:
a2enmod headers
systemctl restart apache2
Następnie uzupełnij plik .htaccess o taki wpis:
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</IfModule>
Zwróć uwagę: HSTS wiąże cię na cały rok. Dopóki wartość jest zapisana w przeglądarce, domena nie jest już osiągalna przez HTTP. Nagłówek ustawiaj dopiero wtedy, gdy HTTPS działa niezawodnie, a wszystkie subdomeny mają ważny certyfikat.
Częste błędy
- Pętla przekierowań („too many redirects”): Niemal zawsze skutek działania proxy ustawionego przed serwerem. Użyj wariantu z
X-Forwarded-Proto. - Nic się nie dzieje: Albo mod_rewrite nie jest aktywny, albo VirtualHost nie dopuszcza pliku .htaccess (
AllowOverride None). - Błąd 500 po zapisaniu: Literówka w pliku .htaccess. Dokładny powód podaje log błędów Apache w
/var/log/apache2/error.log. - Mieszana zawartość: Strona ładuje się wprawdzie przez HTTPS, ale obrazki albo skrypty nadal ładuje przez HTTP. Popraw te adresy w kodzie źródłowym albo w bazie danych.
- Nie można znaleźć pliku: Plik .htaccess zaczyna się kropką i jest przez to ukryty. Zobaczysz go poleceniem
ls -la.
Przekierowanie bez pliku .htaccess
Plik .htaccess jest wczytywany na nowo przy każdym pojedynczym żądaniu. Jeśli masz dostęp do konfiguracji serwera, szybciej będzie zapisać reguły wprost we wpisie VirtualHost. Dla VirtualHosta obsługującego HTTP wystarczy wtedy:
<VirtualHost *:80>
ServerName MojaDomena.pl
Redirect permanent / https://MojaDomena.pl/
</VirtualHost>
Jeśli używasz nginx zamiast Apache, plików .htaccess tam w ogóle nie ma. Przekierowanie wpisujesz wtedy w bloku server dla portu 80:
server {
listen 80;
server_name MojaDomena.pl www.MojaDomena.pl;
return 301 https://$host$request_uri;
}
Najczęstsze pytania
Dlaczego redirect 301, a nie 302?
Mój plik .htaccess jest ignorowany. Z czego to wynika?
Dlaczego ląduję w pętli przekierowań?
Czy to działa także z nginx?
Czy warto dodatkowo włączyć HSTS?
2022-2026 KernelHost GmbH. Wszelkie prawa zastrzeżone. Ten poradnik jest chroniony prawem autorskim. Publikowanie go w innych serwisach, w całości, we fragmentach lub w zmienionej formie, wymaga naszej pisemnej zgody. Cytaty z podaniem źródła i z linkiem są jak najbardziej mile widziane.

