Nginx เปลี่ยนเส้นทางโดเมนย่อยโดเมนเก่าทั้งหมดไปยังโดเมนใหม่


10

ฉันมีโดเมนที่ยาวมากดังนั้นฉันจึงตัดสินใจเปลี่ยนเป็นโดเมนที่สั้นและเป็นมิตรมากขึ้น แต่เนื่องจากฉันมีโดเมนย่อยจำนวนมาก (อันที่จริงฉันมีโดเมนย่อย) จึงต้องการเก็บโดเมนย่อยไว้ขณะที่เปลี่ยนเฉพาะส่วนโดเมน ดังนั้นฉันทำกฎต่อไปนี้:

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

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

ฉันได้อ่านคำถามอื่น ๆ มากมายซึ่งข้อมูลโค้ดนี้แก้ไขปัญหาได้ แต่สำหรับฉัน Nginx จะเปลี่ยนเส้นทางไปยังเสมอ.domain.inโดยไม่มีโดเมนย่อยใด ๆ ฉันกำลังคิดถึงอะไร ฉันได้ทดสอบ regex เทียบกับ regex101 และตัวอย่างทำงานได้ดี Nginx ดูเหมือนจะไม่สามารถเปลี่ยนเส้นทางได้

คำตอบ:


22

เนื่องจาก nginx 0.8.25 ที่ระบุชื่อสามารถใช้ใน server_name คุณควรใช้พวกเขา

$subนี่โดเมนย่อยจะถูกเก็บไว้ในตัวแปรที่เรียกว่า จากนั้นคุณจะสามารถใช้ซ้ำได้ในrewriteคำสั่ง:

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

หรือคุณสามารถเก็บ Regex ที่แท้จริงของคุณและใช้$1ในreturnคำสั่ง:

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

สุดท้ายโปรดทราบว่าreturnคำสั่งเป็นวิธีที่ดีที่สุดสำหรับการเปลี่ยนเส้นทาง คุณอาจพบกับข้อผิดพลาดที่ใช้rewriteสำหรับการเปลี่ยนเส้นทาง


สมบูรณ์ ฉันใช้วิธีการส่งคืน แต่ยังคงชื่อส่วน regex มันง่ายต่อการเข้าใจ
ranisalt

ถ้าเราต้องการเปลี่ยนเส้นทางโดยไม่มีโดเมนย่อย (www) ด้วยล่ะ ไลค์: sub1.ex.to> sub1.new.in และ ex.to> www.new.in?
R. Canser Yanbakan

1
โปรดทราบว่า '\ w' ไม่ตรงกับอักขระบางตัวที่อาจอยู่ในชื่อโดเมนเช่น '-' regex ข้างต้นจะเปลี่ยนเส้นทางtest-sub.doma.inไป.domai.in!
Wolfgang

ใช้ [\ w \ - \ _] + แทน \ w + สำหรับโดเมนย่อยที่มี - และ _ อยู่ในนั้น
Sajjad Ashraf

อะไร~ใน regex ทำในการเริ่มต้น? มันไม่ได้เกิดขึ้นเนื่องจากมีบางสิ่งที่จะปรากฏก่อนหน้านี้^ใน regex
hobbes3
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.