วิธีเพิ่มส่วนหัวที่กำหนดเองที่มีที่อยู่แบบสัมบูรณ์ของทรัพยากรที่ร้องขอตั้งแต่แรก


11

ฉันมีการตั้งค่าต่อไปนี้:

                 |-------|--- backend1:8080
example.com:80---|HAProxy|--- backend2:8080
                 |-------|--- backend3:8080

ฉันต้องการกำหนดค่า HAProxy เพื่อเพิ่มส่วนหัวที่กำหนดเองที่มี URL ดั้งเดิม ตัวอย่างเช่นหากผู้ใช้ร้องขอhttp://example.com/foo?bar=bazคือ:

GET /foo?bar=baz HTTP/1.1
Host: example.com:80

ฉันต้องการให้ HAProxy แปลคำขอนี้เป็นแบ็กเอนด์เช่นนั้น:

GET /foo?bar=baz HTTP/1.1
Host: backend1:8080
x-custom-header: http://example.com/foo?bar=baz

reqaddตัวเลือกเดียวที่ช่วยให้ฉันเพื่อเพิ่มส่วนหัวที่มีค่าคงที่ ฉันสามารถรับส่วนเส้นทางจากคำขอโดยใช้reqrep:

reqrep ^([^\ ]*)\ ([^\ ]*)\ (HTTP\/1\.[10])  \0\r\nx-custom-header:\ \2

แต่น่าเสียดายที่สิ่งนี้จับเฉพาะส่วนของเส้นทางของ url ดั้งเดิมที่ทำให้เกิดส่วนหัวต่อไปนี้:

x-custom-header: /foo?bar=baz

ดังนั้นคำถามของฉันคือว่าเป็นไปได้ใน HAProxy 1.4เพื่อรวมทั้งHostส่วนหัวและบรรทัดแรกของคำขอ HTTP เป็นส่วนหัวที่กำหนดเอง


คุณได้ลองรวมreqaddกับ acl ที่อ้างอิงถึงbe_id(backend-id) หรือไม่? มันไม่ได้มีความแม่นยำ แต่มันอาจช่วยให้คุณเข้าใกล้ได้มากขึ้นถ้าจำนวนแบ็กเอนด์มีขนาดเล็ก ... reqirepนอกจากนี้ยังรองรับ acl เพิ่มเติมดังนั้นคุณสามารถเขียน regexes แยกกันสำหรับแบ็คเอนด์แต่ละอันแต่ละแอคทีฟเฉพาะถ้า acl รหัส
Michael - sqlbot

คำตอบ:


18

คำตอบสั้น ๆ : ไม่มีคุณไม่สามารถทำเช่นนี้ในHAProxy 1.4


อย่างไรก็ตามสำหรับผู้ที่พบคำถามนี้ใน 1.5+:

ใน HAProxy 1.5+ คุณสามารถอ้างอิงตัวแปรผ่านทาง%[variable]ไวยากรณ์และคุณไม่ได้ จำกัด เฉพาะการใช้สตริงคงที่เท่านั้น คุณสามารถดูว่ามีตัวแปรใดบ้างในส่วน 7.3ของคำแนะนำการกำหนดค่า HAProxy (โดยเฉพาะ7.3.6 สำหรับตัวแปรเลเยอร์ 7 )

สำหรับกรณีของคุณคุณดูที่ดิบurlเช่นนี้:

http-request set-header X-Custom-Header %[url]

1
ขอบคุณที่ยืนยันข้อสรุปของฉันว่าเป็นไปไม่ได้ใน 1.4 ฉันเปลี่ยนไปnginxแล้ว
ดารินทินดิมิทรอฟ

% [url] อาจไม่ได้เป็น URL แบบเต็มเสมอไป แต่ดูเหมือนว่า haproxy ที่ดีที่สุดสามารถทำได้ haproxy 1.8 URL ตัวแปร docs: cbonte.github.io/haproxy-dconv/1.8/configuration.html#7.3.6-url
zie
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.