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?

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

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.


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

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

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;

}

0

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

server { 

    if ($host = mydomain.com) {
        return 301 http://www.adifferentdomain.com;
    } 
}

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.