Redirecționare HTTP → HTTPS în Nginx

Redirecționări și rescrieri Toate versiunile Nginx

Tiparul recomandat pentru redirecționarea traficului de pe portul 80 pe HTTPS (și canonizarea cu sau fără www).

Sintaxă
return 301 https://$host$request_uri;

Ce face Redirecționare HTTP → HTTPS

Modul curat în care se face redirecționarea de la HTTP la HTTPS în Nginx este cu două blocuri server separate: primul ascultă pe portul 80 și nu face decât return 301 https://$host$request_uri;, iar al doilea ascultă pe portul 443 ssl și conține configurația reală a site-ului.

Dacă vrei în același timp să canonizezi domeniul (de exemplu să redirecționezi www.example.com la example.com), evită două redirecționări în lanț doar pe HTTP și nu uita că o cerere venită direct pe https://www.example.com are nevoie de certificat valid pentru ambele nume înainte să poată primi redirecționarea 301.

Singura excepție uzuală pe portul 80 este calea /.well-known/acme-challenge/ folosită de Let’s Encrypt pentru validarea HTTP-01, dacă preferi să o servești fără redirecționare.

Opțiuni și argumente

Opțiune / Parametru Descriere
$host Numele de domeniu al cererii (în minuscule, fără port).
$request_uri URI-ul original neschimbat, împreună cu șirul de interogare (?a=1&b=2).
301 Redirecționare permanentă — standardul pentru trecerea la HTTPS.
Strict-Transport-Security Antetul HSTS (în blocul 443) îi spune browserului ca pe viitor să folosească direct HTTPS, fără a mai încerca portul 80.

Exemple

Exemplul 1: Redirecționare simplă HTTP → HTTPS

Orice cerere pe portul 80 este trimisă la aceeași adresă pe https://:

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    server_name example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    root /var/www/example.com/public;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

Exemplul 2: HTTP → HTTPS și www → non-www fără bucle

Trei blocuri clare: portul 80 trimite direct la https://example.com, portul 443 pe www face același lucru, iar al treilea bloc servește site-ul:

# 1. Orice HTTP (cu sau fără www) -> direct https://example.com
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://example.com$request_uri;
}

# 2. HTTPS cu www -> https://example.com
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    server_name www.example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    return 301 https://example.com$request_uri;
}

# 3. Site-ul canonic pe https://example.com
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    server_name example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    root /var/www/example.com/public;
}

Exemplul 3: Verificarea lanțului de redirecționare cu curl -IL

Opțiunea -L urmărește redirecționările, iar -I afișează doar antetele fiecărui pas:

curl -IL http://www.example.com/contact?ref=meniu

Rezultat

HTTP/1.1 301 Moved Permanently
Server: nginx
Location: https://example.com/contact?ref=meniu

HTTP/2 200 
server: nginx
content-type: text/html; charset=utf-8

Greșeli frecvente

  • Folosirea if ($scheme = http) în același bloc server în loc de două blocuri separate: este mai greu de întreținut și evaluează condiția la fiecare cerere HTTPS.
  • Bucla ERR_TOO_MANY_REDIRECTS când folosești Cloudflare în modul „Flexible SSL”: Cloudflare se conectează la serverul tău pe portul 80 (HTTP), iar serverul tău îl redirecționează înapoi la HTTPS la nesfârșit. Setează în Cloudflare modul „Full (strict)” și instalează un certificat pe server.

Comenzi înrudite

  • return: Oprește procesarea cererii și trimite imediat clientului un cod de stare HTTP, o redirecționare sau un text scurt.
  • ssl_certificate și HTTPS: Configurează certificatul, cheia privată, versiunile TLS (1.2/1.3) și cache-ul de sesiuni pentru HTTPS.
  • certbot --nginx: Obține și reînnoiește automat certificate SSL gratuite Let’s Encrypt și actualizează configurația Nginx.
  • listen: Stabilește adresa IP și portul pe care un bloc server acceptă conexiuni.
  • server_name: Stabilește numele de domeniu (antetul Host) pentru care răspunde un bloc server.