Jak skłonić nginx do przekierowania ze strony www na domenę inną niż www?

9

Powiedzmy, że chcę przekierować z www.example.com na example.com i chcę to zrobić za pomocą nginx. Rozejrzałem się i nie zobaczyłem żadnej dobrej dokumentacji na ten temat, więc pomyślałem, że zapytam i odpowiem na własne pytanie.

Jauder Ho
źródło

Odpowiedzi:

7

Spojrzałem na to również na wiki Nginx i innych blogach, a najlepszym sposobem pod względem wydajności jest wykonanie następujących czynności:

Aby przekierować z www.example.com na example.com przy użyciu nginx (wersja 1.0.12 w momencie pisania).

server {
  server_name www.example.com;
  rewrite ^ $scheme://example.com$request_uri permanent; 
  # permanent sends a 301 redirect whereas redirect sends a 302 temporary redirect
  # $scheme uses http or https accordingly
}

server {
  server_name example.com;
  # the rest of your config goes here
}

Gdy żądania przychodzą do example.com, nie, jeśli instrukcje służą do wykonania. I używa $ request_uri zamiast tworzyć dopasowanie 1 $, które opodatkuje przepisywanie (patrz strona Typowe pułapki Nginx).

Źródła:

Daemon
źródło
W moim teście dyrektywy muszą zostać odwrócone, tj. przepisanie musi nastąpić po głównym server {}bloku konfiguracji.
karmi
4

Po kilku kopaniach i błędach, oto rozwiązanie. Gotcha, na którą natrafiłem, to użycie „ http://example.com $ uri”. Wstawienie / przed $ uri powoduje przekierowanie na http://example.com//

  server {
    listen 80;
    server_name www.example.com;
    rewrite ^ http://example.com$uri permanent;
  }

  # the server directive is nginx's virtual host directive.
  server {
    # port to listen on. Can also be set to an IP:PORT
    listen 80;

    # Set the charset
    charset utf-8;

    # Set the max size for file uploads to 10Mb
    client_max_body_size 10M;

    # sets the domain[s] that this vhost server requests for
    server_name example.com;

    # doc root
    root /var/www/example.com;

    # vhost specific access log
    access_log  /var/log/nginx_access.log  main;


    # set vary to off to avoid duplicate headers
    gzip off;
    gzip_vary off;


    # Set image format types to expire in a very long time
    location ~* ^.+\.(jpg|jpeg|gif|png|ico)$ {
        access_log off;
        expires max;
    }

    # Set css and js to expire in a very long time
    location ~* ^.+\.(css|js)$ {
        access_log off;
        expires max;
    }

    # Catchall for everything else
    location / {
      root /var/www/example.com;
      access_log off;

      index index.html;
      expires 1d;

      if (-f $request_filename) {
        break;
      }
    }
  }
Jauder Ho
źródło
4

Proszę odwiedzić to pytanie w SO: https://stackoverflow.com/a/11733363/846634

Z lepszej odpowiedzi:

W rzeczywistości nie potrzebujesz nawet przepisywania.

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

Ponieważ moją odpowiedzią jest coraz więcej głosów, ale także powyższe. Nigdy nie należy używać rewritew tym kontekście. Dlaczego? Ponieważ nginx musi przetworzyć i rozpocząć wyszukiwanie. Jeśli używasz return(który powinien być dostępny w dowolnej wersji nginx), to bezpośrednio zatrzymuje wykonywanie. Jest to preferowane w dowolnym kontekście.

Ali
źródło
1

Aby przekierować na stronę inną niż www, zmień plik vhost:

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

„Stałe” zmienia przekierowanie w przekierowanie 301. Po tym bloku kodu możesz skonfigurować domenę bez www.

W celu przekierowania strony innej niż www na www:

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

Thassit.

BTW, aby uzyskać pełną konfigurację VPS przy użyciu Nginx, sprawdź Biblię VPS na mojej stronie guvnr.com i mam nadzieję, że to się przyda!

Joel Coel
źródło
0

Oto, czego używam:

# ---------------------------------------
# vHost www.example.com
# ---------------------------------------

server {

##
# Redirect www.domain.tld
##

    server_name  www.example.com;
    rewrite ^(.*) http://example.com$1 permanent;

}

# ---------------------------------------
# vHost example.com
# ---------------------------------------

server {

   # Something Something
}
Neel
źródło