Puncte:0

Evitați duplicarea în configurația redirecționărilor nginx?

drapel sy

Configurarea redirecționărilor www â non-www și HTTP â HTTPS în același timp, m-am confruntat cu o problemă de duplicare pe care nu am reușit să o depășesc.

Pe domeniul meu... lasă să fie exemplu.comâAm un site web cu nume principal alt.exemplu.com. Vreau ca cererile exemplu.com, www.example.com, și www.other.example.com pentru a fi redirecționat către alt.exemplu.comși toate solicitările HTTP să fie redirecționate către HTTPS în același timp; De asemenea, vreau să accept HTTP/2 și IPv6.

Nu am nicio problemă în a face acest lucru să funcționeze, dar nu reușesc să scap de duplicarea unei părți substanțiale a fișierului de configurare (și anume setările certificatului HTTPS). Toate încercările de a reduce duplicarea fac ca una sau mai multe sau toate redirecționările să nu mai funcționeze (uneori împreună cu HTTP/2).

Vă rugăm să aruncați o privire la configurație și să sugerați cum să o curățați:

Server {
    asculta 80;
    asculta [::]:80;
    nume_server www.altul.example.com www.example.com another.example.com example.com;
    returnează 301 https://another.example.com$request_uri;
}

Server {
    asculta 443;
    asculta [::]:443;
    nume_server www.other.example.com www.example.com example.com;
    returnează 301 https://another.example.com$request_uri;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    includ /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

Server {
    nume_server another.example.com;
    root /usr/share/nginx/another.example.com;
    index index.html;

    Locație / {
        try_files $uri $uri/ =404;
    }

    asculta [::]:443 ssl http2;
    asculta 443 ssl http2;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    includ /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
Richard Smith avatar
drapel jp
Vedeți [acest exemplu](https://stackoverflow.com/questions/43081780/dns-records-redirect-www-to-non-www/43089681#43089681) pe SO.
gxx avatar
drapel gb
gxx
Alternativ, mutați setările comune într-o configurație dedicată și bazați-vă pe „include”.
drapel sy
@RichardSmith după ce am mutat patru șiruri duplicat în blocul exterior (și le-am șters în ambele blocuri interioare), primesc erori de configurare: `nginx: [warn] valoarea duplicată "TLSv1.2" în /etc/letsencrypt/options-ssl-nginx .conf:11 nginx: [avertizează] valoarea duplicată „TLSv1.3” în /etc/letsencrypt/options-ssl-nginx.conf:11 nginx: [emerg] directiva „ssl_prefer_server_ciphers” este duplicat în /etc/letsencrypt/options-ssl-nginx.conf:12 nginx: fișierul de configurare /etc/nginx/nginx.conf test eșuat`
Richard Smith avatar
drapel jp
Se pare că aveți declarații duplicate undeva. Utilizați `nginx -T` (majusculă `T`) pentru a vizualiza întreaga configurație în toate fișierele incluse.
drapel sy
@RichardSmith da, ai dreptate. Dar după ce am găsit duplicarea, a apărut o altă problemă: există de fapt mai multe domenii de nivel superior în configurația mea nginx. Dacă mut configurația SSL de la un bloc de server la nivelul superior, atunci va funcționa un singur domeniu (de exemplu, `example.com`).
Richard Smith avatar
drapel jp
În acest caz, configurația originală este probabil cea mai bună pe care o puteți realiza. Dacă aveți un număr mare de declarații duplicate, le puteți plasa într-un fișier inclus.
Puncte:0
drapel in
Server {
    nume_server another.example.com;
    root /usr/share/nginx/another.example.com;
    index index.html;

    Locație / {
        try_files $uri $uri/ =404;
    }

    asculta [::]:443 ssl http2;
    asculta 443 ssl http2;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    includ /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
Server {
    asculta 443 ssl;
    asculta [::]:443 ssl;
    nume_server www.altul.example.com www.example.com exemplu.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    includ /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    rescrie ^/(.*)$ https://another.example.com/$1 permanent;
}
Server {
    asculta 80;
    asculta [::]:80;
    nume_server www.altul.example.com www.example.com another.example.com example.com;
    Locație / {
        dacă ($gazdă !~* ^(www)) {
          rescrie ^/(.*)$ https://another.example.com/$1 permanent;
        }
    }
}

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.