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

  1. W Settings → General ustaw WordPress Address (URL) i Site Address (URL) na https://example.com. Potem zaloguj się ponownie.
  2. Sam WordPress nie przekierowuje z http:// na https://. 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.
  3. 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

  1. 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).
  2. Otwórz Domains → Domains.
  3. 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

  1. W Websites & Domains → example.com → SSL/TLS Certificates upewnij się, że jest zainstalowany ważny certyfikat (Let's Encrypt jest darmowy).
  2. Otwórz Websites & Domains → example.com → Hosting & DNS → Hosting (w starszych wersjach Pleska Hosting Settings).
  3. 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.
  4. Kliknij OK (lub Apply).

DirectAdmin

  1. Upewnij się, że domena ma certyfikat: Account Manager → SSL Certificates (Let's Encrypt jest darmowy).
  2. Otwórz Account Manager → Domain Setup i kliknij domenę.
  3. 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

  1. 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).
  2. Przejdź do SSL/TLS → Edge Certificates i włącz Always Use HTTPS. Cloudflare odpowiada na każde żądanie http:// kodem 301 na https://.

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.