Wie kann man Nginx dazu bringen, von einer WWW- zu einer Nicht-WWW-Domain umzuleiten?

9

Angenommen, ich möchte von www.example.com zu example.com umleiten und dies mit nginx tun. Ich sah mich um und sah keine gute Dokumentation dazu, also dachte ich mir, ich würde meine eigene Frage stellen und beantworten.

Jauder Ho
quelle

Antworten:

7

Ich habe mir dies auch im Nginx-Wiki und in anderen Blogs angesehen. Der beste Weg zur Leistung besteht darin, Folgendes zu tun:

Umleiten von www.example.com zu example.com mit nginx (Version 1.0.12 zum Zeitpunkt des Schreibens).

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
}

Wenn Anfragen an example.com kommen, werden keine if-Anweisungen für die Leistung verwendet. Und es verwendet $ request_uri, anstatt eine $ 1-Übereinstimmung erstellen zu müssen, die das Umschreiben besteuert (siehe Seite "Nginx Common Pitfalls").

Quellen:

Daemon
quelle
In meinem Test müssen die Anweisungen umgekehrt werden, dh. Das Umschreiben muss nach dem Hauptkonfigurationsblock erfolgen server {}.
Karmi
4

Nach einigem Herumgraben und einigen Fehltritten ist hier die Lösung. Das Problem, auf das ich gestoßen bin, ist, sicherzustellen, dass " http://example.com $ uri" verwendet wird. Das Einfügen eines / vor $ uri führt zu einer Weiterleitung zu 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
quelle
4

Bitte besuchen Sie diese Frage in SO: /programming//a/11733363/846634

Aus der besseren Antwort:

Eigentlich brauchen Sie nicht einmal ein Umschreiben.

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

Da meine Antwort immer mehr Stimmen bekommt, aber auch die oben genannten. Sie sollten rewritein diesem Zusammenhang niemals ein verwenden . Warum? Weil nginx eine Suche verarbeiten und starten muss. Wenn Sie verwenden return(was in jeder Nginx-Version verfügbar sein sollte), wird die Ausführung direkt gestoppt. Dies ist in jedem Zusammenhang bevorzugt.

Ali
quelle
1

Ändern Sie die vhost-Datei, um zu Nicht-WWW umzuleiten:

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

'Permanent' verwandelt die Umleitung in eine 301-Umleitung. Nach diesem Codeblock können Sie die Domain ohne www konfigurieren.

Für die Umleitung von Nicht-WWW zu WWW:

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

Thassit.

Übrigens, für eine vollständige VPS-Einrichtung mit Nginx lesen Sie die VPS-Bibel auf meiner Website guvnr.com, und ich hoffe, das ist praktisch!

Joel Coel
quelle
0

Das benutze ich:

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