Puncte:0

Nginx - Cum forțez toate domeniile de server și blocurile de server să utilizeze redirecționarea non-www?

drapel de

Există multe rezultate bune despre cum să redirecționați „www” la „non-www” și invers.

Cel mai solutia recomandata este aceasta:

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

Acest lucru funcționează bine pentru un singur fișier de configurare a site-ului web. Cu toate acestea, duplică rapid configurația atunci când aveți mai multe site-uri web sub un server Nginx.

Chiar aș dori să evit dublarea configurației pe un serviciu la care lucrez...

Deci soluția mea presupusă de a captura toate domeniile www.[anything.com] arată cam așa:

Server {
    asculta 80;
    returnează 301 https://$host$request_uri;
}

Cu toate acestea, cred că $gazdă variabila conține încă „www” în interior (ceea ce are sens).

Mă chinui să testez asta cu configurația mea actuală, așa că pentru a economisi timp, te rog, cineva cu mai multă experiență Nginx mă poate indica în direcția corectă dincolo de acest punct?

Multumesc pentru timpul acordat!

Puncte:2
drapel us

Puteți utiliza următoarea abordare:

Server {
    asculta 80;
    nume_server ~^(?:www\.)(.*)$;

    returnează 301 https://$1$request_uri;
}

Expresia regulată surprinde partea de după www. la $1 variabilă, care este apoi utilizată în întoarcere afirmație.

https://nginx.org/r/server_name explică în mai multe detalii modul în care nginx decide care Server bloc de utilizat.

Michael Hampton avatar
drapel cz
Și nu uitați să includeți un bloc `server` ssl cu certificatul(ele) corespunzător(e).
Matthew Spence avatar
drapel de
Acest lucru este foarte puternic, mulțumesc! Voi marca acest lucru drept răspunsul corect la această întrebare. Aș fi totuși curios dacă există o soluție non regex pentru a îmbunătăți performanța?
drapel us
Nu, nu există, pentru că trebuie să extrageți o parte din numele gazdei, iar regex este singura modalitate de a face acest lucru.
Puncte:0
drapel ar
Server { 

         nume_server example.com; 

         returnează 301 https://www.example.com$request_uri; 

}

În mod implicit, dacă omiteți această directivă, nginx presupune că doriți să ascultați pe portul 80.

Aici documentatia a acestui comportament implicit.

Aici configurația completă pentru default-ssl.conf

Server {

 asculta 443 ssl;

 nume_server example.com; 

certificat_ssl /srv/www/example.com/keys/ssl.crt; 

ssl_certificate_key /srv/www/example.com/keys/www.example.com.key; 

returnează 301 https://www.example.com$request_uri; 

}

Puteți înlocui ssl pe; directivă cu listen 443 ssl; ca recomandare de la documentația nginx.

Matthew Spence avatar
drapel de
Multumesc pentru raspuns. Din păcate, acest lucru nu ajută în efortul de a face o soluție „catch all”, așa că nu trebuie să scrieți configurația pe domeniu (cum ați face cu a dumneavoastră aici lucrând doar pentru `example.com` și nu și pentru `example-2. com`)
Puncte:0
drapel sv

Bun venit la ServerFault.

În timp ce ceea ce a răspuns Tero Kilkanen este conceptul de bază, a mai frumos modalitatea de a face același lucru este deja prevăzută în documentația oficială la https://nginx.org/r/server_name iar la https://nginx.org/en/docs/http/server_names.html.

Server {
    nume_server ~^www\.(?<baredomain>.+)$;
    returnează 301 https://$baredomain$request_uri;
}

Aceasta folosește o metodă numită „Capturi cu nume” în timp ce evaluează o expresie regulată. „Capturile denumite” pot folosi oricare dintre următoarele sintaxe...

?<nume> Sintaxă compatibilă cu Perl 5.10, acceptată începând cu PCRE-7.0
?'nume' Sintaxă compatibilă cu Perl 5.10, acceptată începând cu PCRE-7.0
?P<nume> Sintaxă compatibilă Python, acceptată începând cu PCRE-4.0

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.