Nginx ne www www ir ne ne www

Naudodamas pamoką ir naršydamas tinklą naudoju nginx debesyje „Rackspace“ ir vis dar negaliu rūšiuoti.

Noriu www.mysite.com eiti į mysite.com, kaip įprasta .htaccess, SEO ir kitų priežasčių.

Mano /etc/nginx/sites-available/www.example.com.vhost config:

 server { listen 80; server_name www.example.com example.com; root /var/www/www.example.com/web; if ($http_host != "www.example.com") { rewrite ^ http://example.com$request_uri permanent; } 

Aš taip pat bandžiau

 server { listen 80; server_name example.com; root /var/www/www.example.com/web; if ($http_host != "www.example.com") { rewrite ^ http://example.com$request_uri permanent; } 

Aš taip pat bandžiau. Abu antrieji bandymai suteikia nukreipimo ciklo klaidas.

 if ($host = 'www.example.com' ) { rewrite ^ http://example.com$uri permanent; } 

Mano DNS konfigūruojamas kaip standartinis:

 site.com 192.192.6.8 A type at 300 seconds www.site.com 192.192.6.8 A type at 300 seconds 

(pavyzdžiai buvo naudojami IP adresų ir aplankų pavyzdžiams ir padėjo žmonėms ateityje). Aš naudoju Ubuntu 11.

448
30 окт. nustatė TheBlackBenzKid 30 spalis 2011-10-30 21:56 '11, 21:56, 2011-10-30 21:56
@ 16 atsakymų

HTTP sprendimas

Dokumentuose „teisingas būdas nustatyti atskirą serverį pavyzdžiui.org“:

 server { listen 80; server_name example.com; return 301 http://www.example.com$request_uri; } server { listen 80; server_name www.example.com; ... } 

HTTPS sprendimas

Tiems, kurie nori sprendimo, įskaitant https:// ...

 server { listen 80; server_name www.domain.com; # $scheme will get the http protocol # and 301 is best practice for tablet, phone, desktop and seo return 301 $scheme://domain.com$request_uri; } server { listen 80; server_name domain.com; # here goes the rest of your config file # example location / { rewrite ^/cp/login?$ /cp/login.php last; # etc etc... } } 

Pastaba Iš pradžių mano sprendime nepridėjau https:// , nes mes naudojame krovinių tvarkytojus, o mūsų https: // serveris yra SSL serveris, turintis didelį srautą: mes nesumaišome https: // ir http: //.


Norėdami patikrinti „nginx“ versiją, naudokite „ nginx -v .

Pašalinkite www iš URL su nginx peradresavimu

 server { server_name www.domain.com; rewrite ^(.*) http://domain.com$1 permanent; } server { server_name domain.com; #The rest of your configuration goes here# } 

Taigi turite turėti du serverio kodus.

Pridėti www nginx peradresavimo URL

Jei jums reikia atvirkštinio nukreipti iš domeno.com į www.domain.com, galite naudoti:

 server { server_name domain.com; rewrite ^(.*) http://www.domain.com$1 permanent; } server { server_name www.domain.com; #The rest of your configuration goes here# } 

Kaip galite įsivaizduoti, tai yra priešingai ir veikia taip pat, kaip ir pirmame pavyzdyje. Taigi, nesumažinsite savo SEO balų, nes tai yra visiškas peradresavimas ir perkėlimas. Nr www yra priverstas ir katalogas rodomas!

Kai kurie mano kodai pateikiami toliau, kad sužinotumėte geresnę apžvalgą:

 server { server_name www.google.com; rewrite ^(.*) http://google.com$1 permanent; } server { listen 80; server_name google.com; index index.php index.html; #### # now pull the site from one directory # root /var/www/www.google.com/web; # done # location = /favicon.ico { log_not_found off; access_log off; } } 
751
31 окт. Atsakymą pateikė TheBlackBenzKid 31 spalis 2011-10-31 22:18 '11 10:18 val. 2011-10-31 22:18

Tiesą sakant, jums net nereikia perrašyti.

 server { #listen 80 is default server_name www.example.com; return 301 $scheme://example.com$request_uri; } server { #listen 80 is default server_name example.com; ## here goes the rest of your conf... } 

Kaip atsakymą, aš gausiu vis daugiau ir daugiau balsų, bet didesnis. Šiame kontekste neturėtumėte naudoti rewrite . Kodėl? Kadangi nginx turi apdoroti ir pradėti paiešką. Jei naudojate return (kuris turėtų būti prieinamas bet kurioje „nginx“ versijoje), jis nedelsiant sustabdo vykdymą. Tai pageidautina bet kokiame kontekste.

Perkelkite ir ne SSL, ir SSL prie savo ne www partnerio:

 server { listen 80; listen 443 ssl; server_name www.example.com; ssl_certificate path/to/cert; ssl_certificate_key path/to/key; return 301 $scheme://example.com$request_uri; } server { listen 80; listen 443 ssl; server_name example.com; ssl_certificate path/to/cert; ssl_certificate_key path/to/key; # rest goes here... } 

$scheme kintamajame bus tik http jei jūsų serveris tik klausys 80 prievado (numatytoji), o klausymo parametras neturi ssl raktinio žodžio. Nenaudojant kintamojo, jums nebus jokių rezultatų.

border=0

Atkreipkite dėmesį, kad jums reikia dar daugiau serverio blokų, jei naudojate HSTS, nes HSTS antraštės neturėtų būti siunčiamos per nešifruotus ryšius. Todėl jums reikia nešifruotų serverio blokų su peradresavimu ir šifruotais serverio blokais su peradresavimo ir HSTS antraštėmis.

Viskas nukreipiama į SSL (asmeninė konfigūracija UNIX su IPv4, IPv6, SPDY, ...):

 # # Redirect all www to non-www # server { server_name www.example.com; ssl_certificate ssl/example.com/crt; ssl_certificate_key ssl/example.com/key; listen *:80; listen *:443 ssl spdy; listen [::]:80 ipv6only=on; listen [::]:443 ssl spdy ipv6only=on; return 301 https://example.com$request_uri; } # # Redirect all non-encrypted to encrypted # server { server_name example.com; listen *:80; listen [::]:80; return 301 https://example.com$request_uri; } # # There we go! # server { server_name example.com; ssl_certificate ssl/example.com/crt; ssl_certificate_key ssl/example.com/key; listen *:443 ssl spdy; listen [::]:443 ssl spdy; # rest goes here... } 

Manau, kad dabar galite įsivaizduoti kitus ryšius su šiuo modeliu.

Daugiau mano konfigūracijų? Eik čia ir čia .

363
31 июля '12 в 7:58 2012-07-31 07:58 atsakymą pateikė „ Fleshgrinder “ liepos 31 d. , 12:58 , 2012-07-31 07:58

Galite sužinoti, kad norite naudoti tą pačią konfigūraciją daugiau domenų.

Šis fragmentas ištrina www prieš bet kurį domeną:

 if ($host ~* ^www\.(.*)$) { rewrite / $scheme://$1 permanent; } 
29
14 мая '15 в 17:46 2015-05-14 17:46 Atsakymą pateikė Martin Höger gegužės 15 d. 15 val. 17:46 2015-05-14 17:46

Jums reikia dviejų serverių blokų.

Įdėkite juos į savo konfigūracijos failą, pvz., /etc/nginx/sites-available/sitename

Tarkime, jūs nuspręsite naudoti http://example.com kaip pagrindinį adresą.

Jūsų konfigūracijos failas turėtų atrodyti taip:

 server { listen 80; listen [::]:80; server_name www.example.com; return 301 $scheme://example.com$request_uri; } server { listen 80; listen [::]:80; server_name example.com; # this is the main server block # insert ALL other config or settings in this server block } 

Pirmajame serverio bloke bus pateiktos instrukcijos, kaip peradresuoti užklausas „prefiksu“. Jis klauso užklausų, susijusių su URL, kurių pavadinimai yra „www“, ir peradresavimai

Ar nieko daugiau.

Antrajame serverio bloke bus jūsų pagrindinis adresas - URL, kurį norite naudoti. Visi kiti nustatymai yra, pvz., root , index , location ir tt Patikrinkite numatytąjį šių kitų parametrų failą, kurį galite įtraukti į serverio bloką.

Serveriui reikia dviejų DNS įrašų.

 Name: @ IPAddress: your-ip-address (for the example.com URL) Name: www IPAddress: your-ip-address (for the www.example.com URL) 

„Ipv6“ sukurti „AAAA“ įrašų porą naudodami savo IPv6 adresą.

26
28 авг. atsakymas pateiktas Red 28 rug. 2016-08-28 16:35 '16 at 16:35 2016-08-28 16:35

Štai kaip tai padaryti keliems „www-no-www“ serverio pavadinimams (aš tai naudoju subdomenams):

 server { server_name "~^www\.(sub1.example.com)$" "~^www\.(sub2.example.com)$" "~^www\.(sub3.example.com)$"; return 301 $scheme://$1$request_uri ; } 
21
10 дек. Eric Johnson atsakymas, pateiktas gruodžio 10 d. 2014-12-10 20:00 '14 20:00 val. 2014-12-10 20:00

Šis sprendimas priklauso nuo mano asmeninės patirties. Mes naudojome kelis „Amazon S3“ kodus ir vieną serverį, kad nukreiptume non-www domenų vardus į „ www pagal „ S3 Host“ .

Nginx serveriui naudoju šią konfigūraciją:

 server { listen 80; server_name ~^(?!www\.)(?<domain>.+)$; return 301 $scheme://www.$domain$request_uri; } 

Tai atitinka visus domeno vardus, išvardytus serveryje, pradedant nuo kito, išskyrus www. ir nukreipiamas į www.<domain> . Taip pat galite atlikti priešingą nukreipimą iš www į non-www .

16
16 окт. Atsakymas pateikiamas VisioN 16 okt. 2015-10-16 18:44 '15, 18:44 2015-10-16 18:44

pabandykite

  if ($host !~* ^www\.){ rewrite ^(.*)$ https://www.yoursite.com$1; } 

Kitas būdas: Nginx Nr-www į www

 server { listen 80; server_name yoursite.com; root /path/; index index.php; return 301 https://www.yoursite.com$request_uri; } 

ir www ne-www

 server { listen 80; server_name www.yoursite.com; root /path/; index index.php; return 301 https://yoursite.com$request_uri; } 
11
08 окт. atsakymas, kurį pateikė Kevin Nguyen 08 spalis 2013-10-08 20:18 '13, 20:18, 2013-10-08 20:18

Aš sujungiau geriausius iš visų paprastų atsakymų, be sunkiai koduotų domenų.

301 nuolatinis siuntimas iš ne www į www (HTTP arba HTTPS):

 server { if ($host !~ ^www\.) { rewrite ^ $scheme://www.$host$request_uri permanent; } # Regular location configs... } 

Jei pageidaujate ne HTTPS, ne www, HTTPS, peradresuokite WWW vienu metu:

 server { listen 80; if ($host !~ ^www\.) { rewrite ^ https://www.$host$request_uri permanent; } rewrite ^ https://$host$request_uri permanent; } 
10
25 апр. Atsakyti Matt Janssen Bal. 25 2018-04-25 05:56 '18 at 5:56 pm 2018-04-25 05:56

Peradresuokite ne www www

Vienam domenui:

 server { server_name example.com; return 301 $scheme://www.example.com$request_uri; } 

Visiems domenams:

 server { server_name "~^(?!www\.).*" ; return 301 $scheme://www.$host$request_uri; } 

Peradresuoti www į ne-www Vienam domenui:

 server { server_name www.example.com; return 301 $scheme://example.com$request_uri; } 

Visiems domenams:

 server { server_name "~^www\.(.*)$" ; return 301 $scheme://$1$request_uri ; } 
8
25 июля '17 в 10:19 2017-07-25 10:19 Atsakymą pateikė Ravindra Bhalothia liepos 17 d. 17 d. 10:19 2017-07-25 10:19

Unikalus formatas:

 server { listen 80; server_name "~^www\.(.*)$" ; return 301 https://$1$request_uri ; } 
7
19 февр. Atsakymą pateikė Andriyun , vasario 19 d. 2015-02-19 19:01 '15, 19:01, 2015-02-19 19:01
 location / { if ($http_host !~ "^www.domain.com"){ rewrite ^(.*)$ $scheme://www.domain.com/$1 redirect; } } 
4
23 мая '16 в 20:09 2016-05-23 20:09 atsakymą pateikė Maozas Zadokas gegužės 23 d., 16 val. 20:09 2016-05-23 20:09

Nesu tikras, kad kas nors pastebės, kad gali būti teisinga grąžinti 301, bet naršyklė tai daro

 rewrite ^(.*)$ https://yoursite.com$1; 

greičiau nei:

 return 301 $scheme://yoursite.com$request_uri; 
3
04 июня '14 в 4:33 2014-06-04 04:33 atsakymas pateikiamas Steven birželio 14 d. 14 d. 4:33 2014-06-04 04:33

„Ghost blog“

padaryti rekomenduojamą nginx metodą su return 301 $scheme://example.com$request_uri; Jei norite dirbti su „Ghost“, turite įtraukti į pagrindinį serverio bloką:

 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-NginX-Proxy true; proxy_pass_header X-CSRF-TOKEN; proxy_buffering off; proxy_redirect off; 
2
15 нояб. atsakymas pateikiamas ne lapkričio 15 d. 2014-11-15 18:58 '14, 18:58, 2014-11-15 18:58
 if ($host ~* ^www.example.com$) { return 301 $scheme://example.com$request_uri; } 
0
11 июля '16 в 0:36 2016-07-11 00:36 atsakymas duotas karadayi liepos 11 d. 16 val. 0:36 2016-07-11 00:36
  1. Rekomendacija: atskiras server su sunkiu server_name

Geriausia praktika naudojant „nginx“ yra naudoti atskirą server tokiam peradresavimui (nenaudojamas kartu su pagrindinės konfigūracijos server ), viską užkoduokite ir nenaudokite reguliarių išraiškų.

Taip pat gali prireikti kietojo kodo domenų, jei naudojate HTTPS, nes turite iš anksto žinoti, kokie sertifikatai bus pateikti.

 server { server_name www.example.com; return 301 $scheme://example.com$request_uri; } server { server_name www.example.org; return 301 $scheme://example.org$request_uri; } server { server_name example.com example.org; # real configuration goes here } 

  1. Reguliarių išraiškų naudojimas server_name

Jei turite kelias svetaines ir nerūpi maksimalaus našumo, bet norite, kad kiekviena iš jų turėtų tą pačią politiką dėl www. Prefiksas, tada galite naudoti reguliarias išraiškas. Geriausi praktiniai atskiro server naudojimo būdai lieka galioti.

Atkreipkite dėmesį, kad šis sprendimas tampa sudėtingas, jei naudojate https, nes jūs turite turėti vieną sertifikatą, kad galėtumėte tinkamai valdyti visus domeno vardus.


ne nuo www iki www iš regex atskirame server visoms svetainėms:

 server { server_name ~^(?!www\.)(?<domain>.+)$; return 301 $scheme://www.$domain$request_uri; } 

www ne www / regex atskirame server visoms svetainėms:

 server { server_name ~^www\.(?<domain>.+)$; return 301 $scheme://$domain$request_uri; } 

tam tikriems tinklams skirtame server www : ne www / regex:

Gali prireikti apriboti reguliarią išraišką tik keliems domenams, tada galite naudoti kažką panašaus, kad atitiktų tik www.example.org , www.example.com ir www.subdomain.example.net :

 server { server_name ~^www\.(?<domain>(?:example\.org|example\.com|subdomain\.example\.net))$; return 301 $scheme://$domain$request_uri; } 

Reguliarių išraiškų tikrinimas naudojant „nginx“

Galite patikrinti, ar reguliarioji išraiška veikia taip, kaip tikėtasi, su jūsų kompiuteryje pcretest “, kuris yra tas pats „ pcre biblioteka, kurią nginx naudos reguliarioms išraiškoms:

 % pcretest PCRE version 8.35 2014-04-04 re> #^www\.(?<domain>(?:example\.org|example\.com|subdomain\.example\.net))$# data> test No match data> www.example.org 0: www.example.org 1: example.org data> www.test.example.org No match data> www.example.com 0: www.example.com 1: example.com data> www.subdomain.example.net 0: www.subdomain.example.net 1: subdomain.example.net data> subdomain.example.net No match data> www.subdomain.example.net. No match data> 

Atkreipkite dėmesį, kad jums nereikia nerimauti dėl pasekmių ar atvejo, nes nginx jau rūpinosi tuo, kaip nurodoma reguliariai nginx serverio pavadinime, kai „priimančiosios“ antraštėje yra galutinis taškas .


  1. Pabarstykite, if esamas server / HTTPS:

Šis galutinis sprendimas paprastai nelaikomas geriausia praktika, tačiau jis vis dar veikia ir atlieka savo darbą.

Iš tiesų, jei naudojate HTTPS, tai galutinis sprendimas gali būti lengviau prižiūrimas, nes nereikia kopijuoti ir įklijuoti viso SSL direktyvų krūvos tarp skirtingų server apibrėžimų, bet galite tik fragmentus įdėti į reikiamus serverius, todėl derinimas ir derinimas palaikykite savo svetaines.


ne - nuo www iki www :

 if ($host ~ ^(?!www\.)(?<domain>.+)$) { return 301 $scheme://www.$domain$request_uri; } 

www ne www :

 if ($host ~ ^www\.(?<domain>.+)$) { return 301 $scheme://$domain$request_uri; } 

vieno pageidaujamo domeno kietas kodavimas

Jei jums reikia šiek tiek geresnio našumo, taip pat keleto domenų nuoseklumo, kurį gali naudoti vienas server , gali būti prasminga aiškiai koduoti vieną pageidaujamą domeną:

 if ($host != "example.com") { return 301 $scheme://example.com$request_uri; } 

Rekomendacijos:

0
23 янв. atsakymas pateikiamas sausio 23 d 2019-01-23 03:37 '19 at 3:37 nuo 2019-01-23 03:37

Jei turite problemų, jums gali prireikti pridėti serverio IP adresą. Pavyzdžiui:

 server { listen XXX.XXX.XXX.XXX:80; listen XXX.XXX.XXX.XXX:443 ssl; ssl_certificate /var/www/example.com/web/ssl/example.com.crt; ssl_certificate_key /var/www/example.com/web/ssl/example.com.key; server_name www.example.com; return 301 $scheme://example.com$request_uri; } 

kur XXX.XXX.XXX.XXX yra IP adresas (žinoma).

Pastaba: norint tinkamai peradresuoti https užklausas, reikia apibrėžti SSL crt ir pagrindinę vietą

Nepamirškite iš naujo paleisti „nginx“ po pakeitimų:

 service nginx restart 
-5
28 окт. atsakymas pateikiamas undoIT spalio 28 d 2013-10-28 22:14 '13, 10:14 val. 2013-10-28 22:14

Kiti klausimai apie „ žymų arba „ Užduoti klausimą“