Nginx mengalihkan semua subdomain domain lama ke yang baru

10

Saya memiliki domain yang sangat panjang, jadi saya memutuskan untuk mengubahnya menjadi yang lebih pendek dan lebih ramah. Tetapi karena saya memiliki banyak subdomain (pada kenyataannya, saya memiliki wildcard subdomain), saya ingin mempertahankan subdomain sambil mengubah hanya bagian domain. Jadi, saya membuat aturan berikut:

server {
  listen 80;
  server_name ~^(\w+)\.olddomain\.com$;

  rewrite ^ $scheme://$1.doma.in$request_uri? permanent;
}

Saya telah membaca banyak pertanyaan lain di mana cuplikan ini memecahkan masalahnya. Tetapi dengan saya, Nginx selalu dialihkan ke .domain.in, tanpa subdomain apa pun. Apa yang saya lewatkan? Saya telah menguji regex terhadap regex101 dan contoh-contohnya berfungsi dengan baik, Nginx tampaknya tidak dapat mengarahkan ulang.

Ranisalt
sumber

Jawaban:

22

Karena nginx 0.8.25 bernama captures dapat digunakan di server_name. Anda harus menggunakannya.

Di sini, sub-domain akan disimpan dalam variabel yang disebut $sub. Maka Anda akan dapat menggunakannya kembali dalam rewritearahan:

server {
  listen 80;
  server_name ~^(?<sub>\w+)\.olddomain\.com$;
  rewrite ^ $scheme://$sub.doma.in$request_uri? permanent;
}

Atau, Anda dapat menyimpan Regex Anda yang sebenarnya dan menggunakannya $1dalam returnarahan:

server {
  listen 80;
  server_name ~^(\w+)\.olddomain\.com$;
  return 301 $scheme://$1.doma.in$request_uri;
}

Akhirnya, perhatikan bahwa returnarahan adalah pendekatan terbaik untuk pengalihan. Anda dapat mengalami Jebakan menggunakan rewriteuntuk pengalihan.

KRFFR
sumber
Sempurna. Saya menggunakan pendekatan kembali tetapi masih bernama bagian regex, itu jauh lebih mudah dimengerti.
ranisalt
Bagaimana jika kita ingin mengalihkan tanpa subdomain (www) juga? seperti: sub1.ex.to> sub1.new.in dan ex.to> www.new.in?
R. Canser Yanbakan
1
Perhatikan bahwa '\ w' tidak cocok dengan karakter tertentu yang dapat menggunakan nama domain, misalnya '-'. Karenanya regex di atas akan dialihkan test-sub.doma.inke .domai.in!
Wolfgang
gunakan [\ w \ - \ _] + alih-alih \ w + untuk subdomain yang memiliki - dan _ di dalamnya
Sajjad Ashraf
Apa yang dilakukan ~di regex di awal? Itu tidak membuat karena sesuatu akan muncul sebelumnya ^di regex.
hobbes3