Cara mengarahkan ulang url di NGINX

135

Saya perlu mengalihkan setiap permintaan http://test.com ke http://www.test.com . Bagaimana ini bisa dilakukan.

Di blok server saya mencoba menambahkan

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

tapi di browser tertulis

  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.

blok server saya terlihat seperti

 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
sumber
Dokumentasi resmi ada di: nginx.org/en/docs/http/converting_rewrite_rules.html
Marcello Nuccio

Jawaban:

274

Cara terbaik untuk melakukan apa yang Anda inginkan adalah menambahkan blok server lain:

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

Dan edit variabel server_name blok server utama Anda sebagai berikut:

server_name  www.test.com;

Penting : serverBlok baru adalah cara yang benar untuk melakukan ini, ifitu jahat . Anda harus menggunakan lokasi dan server, bukan ifjika memungkinkan. Rewriteterkadang juga jahat , jadi gantilah dengan return.

Dmitry Verhoturov
sumber
19
Anda juga dapat mengakhiri blok server itu dengan return 301 http://wwww.test.com$request_uri;alih - alih menulis ulang.
RCCola
6
ditto @RCCola saat menggunakan, returnbukan rewrite. Lihat dokumen
JCotton
Pertanyaan, bagaimana seharusnya blok server dipesan? yang redirectkemudian main serverblok atau main serverblok maka redirect? Karena saya memiliki masalah yang sama, stackoverflow.com/questions/35451929/…
jhnferraris
Konfigurasi Nginx dalam pertanyaan tersebut benar, urutan tidak masalah.
Dmitry Verhoturov
4
Hanya peringatan cepat: Watch out untuk 301redirect vs 302. Anda mungkin terjebak dengan pengalihan permanen yang disimpan dalam cache, yang membuatnya sangat merepotkan untuk mengubah pengaturan Anda untuk klien yang telah mengakses URL. (Saya tahu OP meminta 301, tapi pastikan itu yang Anda inginkan.)
Nick Merrill
16

Mirip dengan jawaban lain di sini, tetapi ubah http di rewrite menjadi $ scheme seperti:

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

Dan edit variabel server_name blok server utama Anda sebagai berikut:

server_name  www.test.com;

Saya harus melakukan ini untuk mengalihkan www.test.com ke test.com.

Damien Justin Šutevski
sumber
9

Pertama, pastikan Anda telah menginstal Nginx dengan modul penulisan ulang HTTP. Untuk menginstal ini kita perlu memiliki pcre-library

Bagaimana menginstal perpustakaan pcre

Jika hal tersebut di atas sudah selesai atau jika Anda sudah memilikinya, maka tambahkan saja kode di bawah ini di blok server nginx Anda

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

Untuk menghapus www dari setiap permintaan yang dapat Anda gunakan

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

sehingga blok server Anda akan terlihat seperti

  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
sumber
4

Ini adalah hit teratas di Google untuk "nginx redirect". Jika Anda sampai di sini hanya ingin mengarahkan satu lokasi:

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}
Seph Reed
sumber
Cepat dan mudah :)
Vivek Singh