NGINX'te bir URL nasıl yönlendirilir?


135

Her http://test.com isteğini http://www.test.com adresine yönlendirmem gerekiyor . Bu nasıl yapılabilir.

Sunucu bloğuna eklemeyi denedim

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

ama tarayıcıda diyor ki

  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.

sunucu bloğum benziyor

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

Yanıtlar:


274

İstediğinizi yapmanın en iyi yolu başka bir sunucu bloğu eklemektir:

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

Ve ana sunucu bloğu server_name değişkeninizi aşağıdaki gibi düzenleyin:

server_name  www.test.com;

Önemli : Yeni serverblok bunu yapmanın doğru yoludur if, kötülüktür . ifMümkünse yerine konumları ve sunucuları kullanmalısınız . Rewritebazen kötüdür , bu yüzden onunla değiştirilir return.


19
Ayrıca return 301 http://wwww.test.com$request_uri;yeniden yazma yerine sunucu bloğunu sonlandırabilirsiniz .
— RCCola

6
ditto @RCCola returnyerine kullanıyor rewrite. Belgeleri
— JCotton

Soru, sunucu blokları nasıl sipariş edilmelidir? redirectDaha sonra main serverblok veya main serverblok sonra redirect? Aynı problemim olduğu için stackoverflow.com/questions/35451929/…
— jhnferraris

Bahsedilen sorudaki Nginx yapılandırması doğru, sipariş önemli değil.
— Dmitry Verhoturov

4
Hızlı bir uyarı: 301Yönlendirmeye karşı 302. Önbelleğe alınmış bir kalıcı yönlendirme ile takılmış olabilirsiniz. (OP'nin bir şey istediğini biliyorum 301, ama bunun gerçekten ne istediğinden emin ol.)
— Nick Merrill

16

Buradaki başka bir cevaba benzer, ancak yeniden yazmadaki http'yi $ şemasına şu şekilde değiştirin:

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

Ve ana sunucu bloğu server_name değişkeninizi aşağıdaki gibi düzenleyin:

server_name  www.test.com;

Www.test.com'u test.com'a yönlendirmek için bunu yapmak zorunda kaldım.


9

Öncelikle HTTP yeniden yazma modülüyle Nginx'i yüklediğinizden emin olun. Bunu kurmak için pcre-library'e ihtiyacımız var.

Pcre kütüphanesi nasıl kurulabilir

Yukarıda belirtilenler yapıldıysa veya zaten varsa, nginx sunucu bloğunuza aşağıdaki kodu ekleyin

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

Www'yi her istekten kaldırmak için kullanabilirsiniz

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

böylece sunucu bloğunuz

  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

Bu, "nginx redirect" için Google'daki en popüler isabettir. Buraya yalnızca tek bir yeri yeniden yönlendirmek istiyorsanız:

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.