คุณกำลังเปรียบเทียบของคุณ $request_uri
ซึ่งเท่ากับ /app/index.html?target=master
จากตัวอย่างของคุณถึง เป้าหมาย=หลัก
และ เป้าหมาย=ทาส
สตริง ไม่มีการจับคู่ดังนั้น $redirect_to
ตัวแปรกลายเป็นสตริงว่าง หากต้องการตรวจสอบว่า $request_uri
ประกอบด้วย เป้าหมาย=หลัก
หรือ เป้าหมาย=ทาส
สตริงย่อย คุณสามารถใช้รูปแบบ regex ภายใน แผนที่
บล็อก:
แผนที่ $request_uri $redirect_to {
"~target=master" มาสเตอร์เซิร์ฟเวอร์;
"~target=slave" เซิร์ฟเวอร์ทาส;
}
หรือดีกว่าตรวจสอบ $arg_target
ค่าตัวแปร:
แผนที่ $arg_target $redirect_to {
มาสเตอร์มาสเตอร์เซิร์ฟเวอร์;
ทาสรับใช้;
}
พิจารณาใช้บางส่วนด้วย ค่าเริ่มต้น
มูลค่าเมื่อไม่มี เป้า
มีการระบุอาร์กิวเมนต์แบบสอบถามในคำขอ (หรือค่าไม่ถูกต้อง):
แผนที่ $arg_target $redirect_to {
มาสเตอร์มาสเตอร์เซิร์ฟเวอร์;
ทาสรับใช้;
เซิร์ฟเวอร์หลักเริ่มต้น
}
อันสุดท้ายสามารถทำให้ง่ายขึ้นได้
แผนที่ $arg_target $redirect_to {
ทาสรับใช้;
เซิร์ฟเวอร์หลักเริ่มต้น
}
หรือตรวจสอบเบื้องต้นเช่น
แผนที่ $arg_target $redirect_to {
มาสเตอร์มาสเตอร์เซิร์ฟเวอร์;
ทาสรับใช้;
}
เซิร์ฟเวอร์ {
ฟัง 80;
server_name 192.168.1.10;
ถ้า ($redirect_to = '') {
กลับ 501; # ไม่ได้ใช้งาน HTTP 501
}
ที่ตั้ง / {
proxy_pass http://$redirect_to;
}
}
อัปเดต
หากฉันเข้าใจคำถามเพิ่มเติมของคุณถูกต้อง - วิธีโหลดเนื้อหาทั้งหมดจากอัปสตรีมเดียวกันกับไฟล์ HTML หลัก - คุณสามารถลองรับชื่ออัปสตรีมจาก HTTP ผู้อ้างอิง
ค่าส่วนหัวถ้า เป้า
อาร์กิวเมนต์แบบสอบถามหายไปโดยใช้สองล่ามโซ่ แผนที่
บล็อก (นี่คือ regex จริง ๆ):
แผนที่ $arg_target $redirect_to {
มาสเตอร์มาสเตอร์เซิร์ฟเวอร์;
ทาสรับใช้;
เริ่มต้น $by_referer;
}
แผนที่ $http_referer $by_referer {
"~target=master" มาสเตอร์เซิร์ฟเวอร์;
"~target=slave" เซิร์ฟเวอร์ทาส;
}
เซิร์ฟเวอร์ {
...
}