Bagaimana cara mengarahkan ulang ke domain lain menggunakan NGINX?

136

Bagaimana saya bisa mengalihkan mydomain.comdan subdomain apa saja *.mydomain.comuntuk www.adifferentdomain.commenggunakan NGINX?

deb
sumber

Jawaban:

276

server_name mendukung kecocokan sufiks menggunakan sintaks .mydomain.com:

server {
  server_name .mydomain.com;
  rewrite ^ http://www.adifferentdomain.com$request_uri? permanent;
}

atau pada versi 0.9.1 atau lebih tinggi:

server {
  server_name .mydomain.com;
  return 301 http://www.adifferentdomain.com$request_uri;
}
kolbyjack
sumber
1
Apakah saya tidak perlu memasukkan port untuk mendengarkan? mis. dengarkan 80. Saya memiliki banyak domain yang perlu saya alihkan ke domain primer, tetapi server saya juga memiliki beberapa server virtual untuk berbagai domain lainnya.
Ryan
1
@Ryan listenArahan default ke port 80 saat tidak ditentukan. Ini sebenarnya sedikit lebih rumit daripada itu secara umum; lihat dokumen konfigurasi nginx untuk lebih jelasnya.
Yitz
2
Apa yang ?dicapai di akhir?
Dan Dascalescu
5
Apa perbedaan antara rewritedan return 301 $scheme://www.adifferentdomain.com$request_uri;?
Dan Dascalescu
6
Itu? pada akhir penulisan ulang memberitahu nginx untuk tidak menambahkan string kueri asli. Karena $request_urisudah memiliki string kueri, tidak perlu menambahkannya lagi. The return 301sintaks yang lebih baru, dan seharusnya tidak ada perbedaan perilaku antara dua metode, tetapi ketika saya awalnya menjawab pertanyaan ini, banyak distribusi tidak memiliki versi yang diperlukan, jadi aku pergi dengan sintaks yang lebih aman.
kolbyjack
15

Mengapa menggunakan modul penulisan ulang jika Anda bisa melakukannya return? Secara teknis, returnadalah bagian dari modul penulisan ulang seperti yang dapat Anda baca di sini tetapi potongan ini lebih mudah dibaca imho.

server {
    server_name  .domain.com;

    return 302 $scheme://forwarded-domain.com;
}

Anda juga dapat memberikan pengalihan 301.

Robin van Baalen
sumber
1
Apakah ini akan tetap menyimpan path dan kueri params?
mpen
3
Tidak, contoh ini tidak melakukan hal itu @ Mark. Tapi saya kira Anda dapat mencampur jawaban sebelumnya dengan sesuatu seperti ini:return 302 $scheme://forwarded-domain.com$request_uri;
Robin van Baalen
Sebagai catatan, dalam banyak kasus, Anda mungkin harus mengarahkan ulang ke https alih-alih mempertahankan skema (mis. Gunakan https alih-alih $ skema). Ini untuk alasan yang sama tautan protokol-relatif sekarang dianggap usang - paulirish.com/2010/the-protocol-relative-url
mahemoff
@mahemoff Itu tidak sepenuhnya benar. Pertimbangkan kasus memiliki server web di belakang loadbalancer yang menggunakan ssl.
Sebastian Neira
11

Itu harus bekerja melalui HTTPRewriteModule .

Contoh menulis ulang dari www.example.com ke example.com:

server {    
    server_name www.example.com;    
    rewrite ^ http://example.com$request_uri? permanent; 
}
udo
sumber
itu hanya mengarahkan www.example.com ke example.com. Saya ingin mengarahkan keduanya ke domain yang berbeda. Bisakah saya melakukannya dalam satu aturan?
deb
Saya tidak tahu pasti, tapi saya pikir server_name mydomain.com; tulis ulang www.adifferentdomain.com permanen; } harus melakukannya? Itu harus mengambil semuanya * .mydomain.com?
udo
@ deb Anda hanya perlu server_name example.com www.example.com;.
citruspi
Pertanyaannya secara khusus meminta subdomain untuk diarahkan ke domain yang berbeda . Jawaban ini tidak menjawab keduanya (secara eksplisit).
Kissaki
ini tidak ada yang penting 301!
Sliq
9

Jika Anda ingin mengarahkan kembali permintaan untuk "domain1.com" ke "domain2.com", Anda dapat membuat blok server yang terlihat seperti ini:

server {
    listen 80;
    server_name domain1.com;
    return 301 $scheme://domain2.com$request_uri;
}
ZanMax
sumber
Seseorang mungkin perlu mengarahkan https: // minta juga. listen 443;
Rafik Farhad
0

Arahan ulang sementara

rewrite ^ http://www.RedirectToThisDomain.com$request_uri? redirect;

Arahan ulang permanen

rewrite ^ http://www.RedirectToThisDomain.com$request_uri? permanent;

Dalam file konfigurasi nginx untuk situs tertentu:

server {    
    server_name www.example.com;
    rewrite ^ http://www.RedictToThisDomain.com$request_uri? redirect;

}
Taimoor Changaiz
sumber
0

Anda cukup menulis kondisi if di dalam blok server {}:

server { 

    if ($host = mydomain.com) {
        return 301 http://www.adifferentdomain.com;
    } 
}
cryptoKTM
sumber
Anda harus berhati-hati menggunakan pernyataan 'jika' pada Nginx ( nginx.com/resources/wiki/start/topics/depth/ifisevil ). Dalam hal ini Anda bisa menggunakan 'server_name mydomain.com' sebagai gantinya.
Marty
jika jahat ketika digunakan dalam konteks lokasi, aman saat digunakan untuk menentukan host redirect
cryptoKTM