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 blocserverîn loc de două blocuri separate: este mai greu de întreținut și evaluează condiția la fiecare cerere HTTPS. - Bucla
ERR_TOO_MANY_REDIRECTScâ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.