Come reindirizzare un URL in NGINX


135

Devo reindirizzare ogni richiesta http://test.com a http://www.test.com . Come si può fare.

Nel blocco server ho provato ad aggiungere

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

ma nel browser dice

  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.

il mio blocco server sembra

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

La documentazione ufficiale è disponibile su: nginx.org/it/docs/http/converting_rewrite_rules.html
Marcello Nuccio,

Risposte:


274

Il modo migliore per fare quello che vuoi è aggiungere un altro blocco server:

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

E modifica la variabile del server principale server_name come segue:

server_name  www.test.com;

Importante : il nuovo serverblocco è il modo giusto per farlo, ifè malvagio . È necessario utilizzare percorsi e server anziché ifse è possibile. Rewritea volte è anche malvagio , quindi lo ha sostituito con return.


19
Si potrebbe anche terminare quel blocco di server con return 301 http://wwww.test.com$request_uri;invece di riscrivere.
RCCola,

6
idem @RCCola sull'uso returninvece di rewrite. Vedi documenti
JCotton,

Domanda, come devono essere ordinati i blocchi server? l' redirectpoi il main serverblocco o main serverblocco allora il redirect? Perché ho lo stesso problema, stackoverflow.com/questions/35451929/...
jhnferraris

La configurazione di Nginx nella domanda menzionata è corretta, l'ordine non ha importanza.
Dmitry Verhoturov,

4
Solo un breve avvertimento: fai attenzione al 301reindirizzamento rispetto a 302. Potresti rimanere bloccato con un reindirizzamento permanente memorizzato nella cache, il che rende molto problematico modificare le impostazioni per i client che hanno già effettuato l'accesso a un URL. (So ​​che l'OP ha chiesto un 301, ma assicurati che sia davvero quello che vuoi.)
Nick Merrill,

16

Simile a un'altra risposta qui, ma cambia il http nella riscrittura in $ schema in questo modo:

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

E modifica la variabile del server principale server_name come segue:

server_name  www.test.com;

Ho dovuto farlo per reindirizzare www.test.com a test.com.


9

Innanzitutto assicurati di aver installato Nginx con il modulo di riscrittura HTTP. Per installarlo dobbiamo avere pcre-library

Come installare la libreria pcre

Se quanto sopra è fatto o se li hai già, aggiungi semplicemente il codice qui sotto nel tuo blocco server nginx

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

Per rimuovere www da ogni richiesta che puoi usare

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

così apparirà il tuo blocco server

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

3

Questo è il massimo successo su Google per "reindirizzamento nginx". Se sei arrivato qui volendo reindirizzare una singola posizione:

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.