Jak przekierować adres URL w NGINX

135

Muszę przekierowywać każde żądanie http://test.com do http://www.test.com . Jak to zrobić.

W bloku serwera próbowałem dodać

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

ale w przeglądarce mówi

  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.

jak wygląda mój blok serwera

 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.
źródło
Oficjalna dokumentacja jest dostępna pod adresem: nginx.org/en/docs/http/converting_rewrite_rules.html
Marcello Nuccio

Odpowiedzi:

274

Najlepszym sposobem na zrobienie tego, co chcesz, jest dodanie kolejnego bloku serwera:

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

I edytuj zmienną nazwa_serwera bloku głównego serwera w następujący sposób:

server_name  www.test.com;

Ważne : nowy serverblok to właściwy sposób, aby to zrobić, ifjest zły . ifJeśli to możliwe, musisz zamiast tego używać lokalizacji i serwerów . Rewritebywa też zły , więc zastąpiłem go return.

Dmitry Verhoturov
źródło
19
Możesz także zakończyć ten blok serwera za pomocą return 301 http://wwww.test.com$request_uri;zamiast przepisywania.
RCCola
6
ditto @RCCola na używanie returnzamiast rewrite. Zobacz dokumentację
JCotton,
Pytanie, jak należy zamawiać bloki serwera? redirectwówczas main serverblok lub main serverblok wtedy redirect? Ponieważ mam ten sam problem, stackoverflow.com/questions/35451929/…
jhnferraris
Konfiguracja Nginx we wspomnianym pytaniu jest poprawna, kolejność nie ma znaczenia.
Dmitry Verhoturov
4
Tylko krótkie ostrzeżenie: uważaj na 301przekierowanie w porównaniu z 302. Możesz utknąć z przechowywanym w pamięci podręcznej trwałym przekierowaniem, co sprawia, że ​​zmiana ustawień dla klientów, którzy już uzyskali dostęp do adresu URL, jest bardzo kłopotliwa. (Wiem, że OP poprosił o 301, ale upewnij się, że naprawdę tego chcesz.)
Nick Merrill,
16

Podobna do innej odpowiedzi tutaj, ale zmień http w schemacie przepisywania na $ w następujący sposób:

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

I edytuj zmienną nazwa_serwera bloku głównego serwera w następujący sposób:

server_name  www.test.com;

Musiałem to zrobić, aby przekierować www.test.com na test.com.

Damien Justin Šutevski
źródło
9

Najpierw upewnij się, że zainstalowałeś Nginx z modułem przepisywania HTTP. Aby to zainstalować, potrzebujemy biblioteki pcre

Jak zainstalować bibliotekę pcre

Jeśli powyższe jest wykonane lub jeśli już je masz, po prostu dodaj poniższy kod do bloku serwera nginx

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

Aby usunąć www z każdego żądania, możesz użyć

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

więc twój blok serwera będzie wyglądał

  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.
źródło
3

To najpopularniejszy hit w Google dotyczący „przekierowania nginx”. Jeśli przyszedłeś tutaj, chcąc przekierować jedną lokalizację:

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}
Seph Reed
źródło