Nginx no-www to www and www to no-www

Jeśli chcesz dowiedzieć się więcej na ten temat, skontaktuj się z nami, aby dowiedzieć się więcej na ten temat.

Chcę www.mysite.com aby przejść do mysite.com jak zwykle whtaccess dla SEO i innych powodów.

My / 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;
       }

Ja też próbowałem

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;
       }
Ja też próbowałem. Obie drugie próby powodują błędy pętli redirect.
if ($host = 'www.example.com' ) {
rewrite ^ http://example.com$uri permanent;
}

Mój DNS jest ustawiony jako standard:

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

(przykładowe adresy IP i foldery zostały użyte w przykładach i aby pomóc ludziom w przyszłości). Używam Ubuntu 11.

Author: TheBlackBenzKid, 2011-10-30

15 answers

Rozwiązanie HTTP

Z dokumentacji , "właściwym sposobem jest zdefiniowanie oddzielnego serwera dla example.org": {]}

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

server {
    listen       80;
    server_name  www.example.com;
    ...
}

Rozwiązanie HTTPS

Dla tych, którzy chcą rozwiązania, w tym 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...

        }
}

Uwaga: pierwotnie nie uwzględniłem https:// w moim rozwiązaniu, ponieważ używamy loadbalancers, a nasz serwer https:// jest serwerem płatności SSL o dużym natężeniu ruchu: nie mieszamy https: / / i http://.


Aby sprawdzić wersję nginx, użyj nginx -v.

W tym celu należy skontaktować się z naszym Biurem Obsługi Klienta.]}

server {
    server_name  www.domain.com;
    rewrite ^(.*) http://domain.com$1 permanent;
}

server {
    server_name  domain.com;
    #The rest of your configuration goes here#
}

Więc musisz mieć dwa kody serwera.

W tym celu prosimy o zapoznanie się z naszą Polityką Prywatności.]}

Jeśli potrzebujesz czegoś odwrotnego, aby przekierować z domain.com na www.domain.com, możesz użyć tego:

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#
}

Jak można sobie wyobrazić, jest to dokładnie odwrotnie i działa w ten sam sposób w pierwszym przykładzie. W ten sposób nie dostaniesz znaczników SEO, ponieważ jest to kompletne przekierowanie perm i przeniesienie. Na brak WWW jest wymuszony i katalog pokazany!

Niektóre z mojego kodu pokazanego poniżej dla lepszego widoku:

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;
       }
}

 734
Author: TheBlackBenzKid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-19 17:32:15

Właściwie nawet nie trzeba przepisywać.

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...
}

Jako, że moja odpowiedź jest coraz więcej głosów w górę, ale powyższe również. Nigdy nie powinieneś używać rewrite w tym kontekście. Dlaczego? Ponieważ nginx musi przetworzyć i rozpocząć wyszukiwanie. Jeśli użyjesz return (które powinno być dostępne w dowolnej wersji nginx), natychmiast zatrzymasz wykonanie. Jest to preferowane w każdym kontekście.

Przekierowanie obu, Nie-SSL I SSL do ich odpowiednika nie-www:

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...
}

Zmienna $scheme będzie zawierać tylko http jeśli twój serwer nasłuchuje tylko na porcie 80 (domyślnie) i opcja listen nie zawiera słowa kluczowego ssl. Nieużywanie tej zmiennej nie zapewni Ci żadnej wydajności.

Zauważ, że potrzebujesz jeszcze więcej bloków serwera, jeśli używasz HSTS, ponieważ nagłówki HSTS nie powinny być wysyłane przez nieszyfrowane połączenia. Dlatego potrzebne są niezaszyfrowane bloki serwerów z przekierowaniami i zaszyfrowane bloki serwerów z przekierowaniami i nagłówkami HSTS.

Przekierowanie wszystkiego NA SSL (personal config on UNIX z 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...
}

Myślę, że możesz sobie teraz wyobrazić inne związki z tym wzorem.

Więcej moich configów? Idź tutaj i tutaj .

 355
Author: Fleshgrinder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-22 12:39:30

Może się okazać, że chcesz użyć tego samego config dla większej liczby domen.

Następujący fragment usuwa www przed dowolną domeną:

if ($host ~* ^www\.(.*)$) {
    rewrite / $scheme://$1 permanent;
}
 27
Author: Martin Höger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-15 13:09:38

Oto Jak to zrobić dla wielu nazw serwerów www do no-www (użyłem tego dla subdomen):

server {
        server_name 
             "~^www\.(sub1.example.com)$"
             "~^www\.(sub2.example.com)$"
             "~^www\.(sub3.example.com)$";
         return 301 $scheme://$1$request_uri ;
}
 20
Author: Eric Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-10 17:00:29

Potrzebujesz dwóch bloków serwerowych.

Włóż je do swojego pliku konfiguracyjnego np /etc/nginx/sites-available/sitename

Powiedzmy, że zdecydujesz się na http://example.com jako główny adres do użycia.

Twój plik konfiguracyjny powinien wyglądać tak:

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
}

Pierwszy blok serwera będzie zawierał instrukcje przekierowywania żądań z prefiksem 'www'. Nasłuchuje żądania adresu URL z prefiksem " www " i przekierowań.

Nie robi nic innego.

Drugi blok serwera będzie przytrzymaj swój adres główny-adres URL, którego chcesz użyć. Wszystkie inne ustawienia przejdź tutaj jak root, index, location, itd. Sprawdź domyślny plik dla tych innych ustawień, które możesz włączyć w bloku serwera.

Serwer potrzebuje dwóch rekordów DNS A.
Name: @ IPAddress: your-ip-address (for the example.com URL)

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

Dla ipv6 Utwórz parę rekordów AAAA używając adresu-ipv6.

 17
Author: Red,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-18 02:07:53

To rozwiązanie pochodzi z mojego osobistego doświadczenia. Użyliśmy kilku łyżek Amazon S3 i jednego serwera do przekierowania non-www do wwwnazw domen, aby dopasować politykę nagłówka S3 "Host" .

Użyłem następującej konfiguracji dla serwera nginx:

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

To pasuje do wszystkich nazw domen wskazywanych na serwer, zaczynając od whatever but www. i przekierowując na www.<domain>. W ten sam sposób można zrobić odwrotne przekierowanie z www do non-www.

 14
Author: VisioN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-16 15:44:33

Spróbuj tego

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

W inny sposób: Nginx no-www to www

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

I www do no-www

server {
  listen       80;
  server_name  www.yoursite.com;
  root /path/;
  index index.php;
  return       301 https://yoursite.com$request_uri;
}
 10
Author: Kevin Nguyen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-25 17:38:12

Unikalny format:

server {
  listen 80;
  server_name "~^www\.(.*)$" ;
  return 301 https://$1$request_uri ;
}
 7
Author: Andriyun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-19 16:01:47

Redirect non-www to www

Dla Pojedynczej Domeny:

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

Dla Wszystkich Domen:

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

Redirect www to non-www Dla Pojedynczej Domeny:

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

Dla Wszystkich Domen:

server {
         server_name "~^www\.(.*)$" ;
         return 301 $scheme://$1$request_uri ;
}
 7
Author: Ravindra Bhalothia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-25 07:19:11

Połączyłem najlepsze ze wszystkich prostych odpowiedzi, bez zakodowanych domen.

301 stałe przekierowanie z nie-www do www (HTTP lub HTTPS):

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

    # Regular location configs...
}

Jeśli wolisz non-HTTPS, non-www do HTTPS, www przekierowanie w tym samym czasie:

server {
    listen 80;

    if ($host !~ ^www\.) {
        rewrite ^ https://www.$host$request_uri permanent;
    }

    rewrite ^ https://$host$request_uri permanent;
}
 6
Author: Matt Janssen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-25 02:56:30
location / { 
    if ($http_host !~ "^www.domain.com"){ 
        rewrite ^(.*)$ $scheme://www.domain.com/$1 redirect; 
    } 
}
 4
Author: Maoz Zadok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-23 17:09:50

Nie wiem, czy ktoś zauważy, że może być poprawne zwrócenie 301, ale przeglądarki dławią się tym, że robią

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

Jest szybszy niż:

return 301 $scheme://yoursite.com$request_uri;
 3
Author: steven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-04 01:33:15

Ghost blog

Jeśli chcesz, aby nginx pracował z Ghostem, musisz dodać do swojego głównego bloku serwera:
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
Author: nottinhill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-15 15:58:51
if ($host ~* ^www.example.com$) {
    return 301 $scheme://example.com$request_uri;
}
 0
Author: karadayi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-10 21:36:31

Jeśli masz problemy z uruchomieniem tego działania, może być konieczne dodanie adresu IP serwera. Na przykład:

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;
}

Gdzie XXX. XXX. XXX. XXX To Adres IP (oczywiście).

UWAGA: Aby poprawnie przekierowywać żądania https

Nie zapomnij ponownie uruchomić nginx po wprowadzeniu zmian:]}
service nginx restart
 -5
Author: undoIT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-28 21:36:36