So leiten Sie eine URL in NGINX um

135

Ich muss jede http://test.com Anfrage an http://www.test.com umleiten . Wie kann das gemacht werden?

Im Serverblock habe ich versucht hinzuzufügen

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

aber im Browser heißt es

  The page isn't redirecting properly

  Firefox has detected that the server is redirecting the request for 
  this address in a way that will never complete.

Mein Serverblock sieht aus wie

 server {
            listen       80;
            server_name  test.com;
            client_max_body_size   10M;
            client_body_buffer_size   128k;

            root       /home/test/test/public;
            passenger_enabled on;
            rails_env production;

            #rewrite ^/(.*) http://www.test.com/$1 permanent;
            #rewrite ^(.*)$ $scheme://www.test.com$1;

            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                    root   html;
            }
    }
Amal Kumar S.
quelle
Die offizielle Dokumentation ist unter: nginx.org/en/docs/http/converting_rewrite_rules.html
Marcello Nuccio

Antworten:

274

Der beste Weg, um das zu tun, was Sie wollen, ist das Hinzufügen eines weiteren Serverblocks:

server {
        #implemented by default, change if you need different ip or port
        #listen *:80 | *:8000;
        server_name test.com;
        return 301 $scheme://www.test.com$request_uri;
}

Bearbeiten Sie die Variable server_name Ihres Hauptserverblocks wie folgt:

server_name  www.test.com;

Wichtig : Neuer serverBlock ist der richtige Weg, ifist böse . Sie müssen Standorte und Server verwenden, anstatt ifwenn dies möglich ist. Rewriteist manchmal auch böse , also ersetzt es durch return.

Dmitry Verhoturov
quelle
19
Sie können diesen Serverblock auch mit return 301 http://wwww.test.com$request_uri;anstelle des Umschreibens beenden .
RCCola
6
dito @RCCola bei der Verwendung returnanstelle von rewrite. Siehe docs
JCotton
Frage, wie sollen die Serverblöcke bestellt werden? das redirectdann der main serverblock oder main serverblock dann das redirect? Weil ich das gleiche Problem habe, stackoverflow.com/questions/35451929/…
jhnferraris
Die Nginx-Konfiguration in der genannten Frage ist korrekt, die Reihenfolge spielt keine Rolle.
Dmitry Verhoturov
4
Nur eine kurze Warnung: Achten Sie auf die 301Weiterleitung gegen die 302. Möglicherweise bleibt eine zwischengespeicherte permanente Weiterleitung hängen, was es sehr mühsam macht, Ihre Einstellungen für Clients zu ändern, die bereits auf eine URL zugegriffen haben. (Ich weiß, dass der OP nach einem gefragt hat 301, aber seien Sie sicher, dass Sie das wirklich wollen.)
Nick Merrill
16

Ähnlich wie bei einer anderen Antwort hier, aber ändern Sie das http beim Umschreiben in $ Schema wie folgt:

server {
        listen 80;
        server_name test.com;
        rewrite     ^ $scheme://www.test.com$request_uri? permanent;
}

Bearbeiten Sie die Variable server_name Ihres Hauptserverblocks wie folgt:

server_name  www.test.com;

Ich musste dies tun, um www.test.com zu test.com umzuleiten.

Damien Justin Šutevski
quelle
9

Stellen Sie zunächst sicher, dass Sie Nginx mit dem HTTP-Umschreibemodul installiert haben. Um dies zu installieren, benötigen wir eine PCRE-Bibliothek

So installieren Sie die PCRE-Bibliothek

Wenn die oben genannten Schritte ausgeführt wurden oder wenn Sie sie bereits haben, fügen Sie einfach den folgenden Code in Ihren Nginx-Serverblock ein

  if ($host !~* ^www\.) {
    rewrite ^(.*)$ http://www.$host$1 permanent;
  }

Um www von jeder Anfrage zu entfernen, die Sie verwenden können

  if ($host = 'www.your_domain.com' ) {
   rewrite  ^/(.*)$  http://your_domain.com/$1  permanent;
  }

So sieht Ihr Serverblock aus

  server {
            listen       80;
            server_name  test.com;
            if ($host !~* ^www\.) {
                    rewrite ^(.*)$ http://www.$host$1 permanent;
            }
            client_max_body_size   10M;
            client_body_buffer_size   128k;

            root       /home/test/test/public;
            passenger_enabled on;
            rails_env production;

            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                    root   html;
            }
    }
Amal Kumar S.
quelle
2

Dies ist der Top-Hit bei Google für "Nginx Redirect". Wenn Sie hier angekommen sind und nur einen einzelnen Standort umleiten möchten:

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}
Seph Reed
quelle