ฉันพยายามแปลงพร็อกซีย้อนกลับโดยใช้การตั้งค่า Apache mod_rewrite ที่น่าสนใจเพื่อใช้ Nginx แทน (เนื่องจากความกังวลภายนอกที่เราย้ายจาก Apache เป็น Nginx และทุกอย่างทำงานได้ดียกเว้นส่วนนี้)
การตั้งค่าดั้งเดิมของฉันคือการอ่านคุกกี้ HTTP (กำหนดโดยแอพพลิเคชั่นบางตัว) และขึ้นอยู่กับค่าของมัน มันเป็นอะไรเช่นนี้:
RewriteCond %{HTTP_COOKIE} proxy-target-A
RewriteRule ^/original-request/ http://backend-a/some-application [P,QSA]
RewriteCond %{HTTP_COOKIE} proxy-target-B
RewriteRule ^/original-request http://backend-b/another-application [P,QSA]
RewriteRule ^/original-request http://primary-backend/original-application [P,QSA]
ฉันพยายามทำสิ่งเดียวกันโดยใช้ Nginx และการกำหนดค่าเริ่มต้นของฉันเป็นแบบนี้ (โดยที่ "proxy_override" เป็นชื่อของคุกกี้):
location /original-request {
if ($cookie_proxy_override = "proxy-target-A") {
rewrite . http://backend-a/some-application;
break;
}
if ($cookie_proxy_override = "proxy-target-B") {
rewrite . http://backend-b/another-application;
break;
}
proxy_pass http://primary-backend/original-application;
}
แต่มันก็ไม่ได้ ฉันพยายามดูว่า Nginx สามารถอ่านคุกกี้ของฉันได้หรือไม่โดยเขียนพร็อกซีหลักเพื่อเปลี่ยนเส้นทางไปยังบางสิ่งตาม${cookie_proxy_override}
และฉันเห็นว่ามันอ่านเนื้อหาได้ดี แต่if
ดูเหมือนว่าจะล้มเหลวเสมอ
ความพยายามครั้งต่อไปของฉันตามคำตอบของ Rikih คือ:
location /original-request {
if ($http_cookie ~ "proxy-target-A") {
rewrite . http://backend-a/some-application;
break;
}
if ($http_cookie ~ "proxy-target-B") {
rewrite . http://backend-b/another-application;
break;
}
proxy_pass http://primary-backend/original-application;
}
และตอนนี้ฉันเห็นได้ว่าif
บล็อกถูกเปิดใช้งาน แต่แทนที่จะแสดงคำขอ (เช่นฉันคิดว่ามันจะทำ) มันส่งคืน 302 การเปลี่ยนเส้นทางไปยัง URL ที่ระบุ - ซึ่งไม่ใช่สิ่งที่ฉันพยายามทำ: ฉันต้องการเซิร์ฟเวอร์ เพื่อถ่ายทอดคำขอไปยังแบ็กเอนด์อย่างโปร่งใสและตอบสนองไปยังไคลเอนต์เดิม
ผมทำอะไรผิดหรือเปล่า?
if
) และฉันก็ดำเนินการ แม้ว่าจะมีปัญหาหนึ่ง - Nginx (อย่างน้อยรุ่นของฉัน: 1.0.0) ไม่ชอบการจับภาพหมายเลขmap
ดังนั้นฉันจึงต้องใช้~^(?P<name>[\w-]+) $name;
แทน ฉันได้แก้ไขคำตอบของคุณแล้ว