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.