วิธีเพิ่มส่วนหัวการตอบกลับด้วย HAproxy 1.6 ตามคำขอ URI


9

ฉันใช้ HAproxy 1.6 เป็น load balancer หน้าเซิร์ฟเวอร์ Tomcat

ฉันต้องการเพิ่มส่วนหัวการตอบกลับตามคำขอ URI

ตัวอย่างเช่นฉันต้องการเพิ่มหัวข้อการตอบกลับCache-Control public,max-age="600"เมื่อคำขอ uri เป็น/apiแต่ไม่ใช่เมื่อคำขอ uri เป็นอย่างอื่น

  • ความพยายามครั้งแรกของฉันคือการใช้ acl ตามเส้นทางเพื่อเพิ่มส่วนหัวในการตอบสนอง http:

    acl api path_reg ^/api/(.*)$
    http-response add-header Cache-Control public,max-age="600" if api
    

    เมื่อฉันเริ่ม haproxy ด้วย-dฉันมีคำเตือนว่าpath_reg(หรือpath) เข้ากันไม่ได้กับhttp-response:

    Dec  6 15:22:29 ip-10-30-0-196 haproxy-systemd-wrapper[315]: 
    [WARNING] 340/152229 (2035) : parsing 
    [/etc/haproxy/haproxy.cfg:78] : acl 'api' will never match because 
    it only involves keywords that are incompatible with 'backend 
    http-response header rule'
    
  • ฉันพยายามเพิ่มส่วนหัวhttp-requestแทนhttp-response:

    acl api path_reg ^/api/(.*)$
    http-request add-header Cache-Control public,max-age="600" if api
    

    มันใช้งานได้ แต่ฉันต้องการมันในการตอบกลับ

  • ฉันยังพยายามใช้ตัวแปร haproxy:

    http-request set-var(txn.path) path
    acl path_acl %[var(txn.path)] -m ^/api/(.*)$
    http-response add-header Cache-Control public,max-age="600" if path_acl
    

    แต่เมื่อฉันลอง HAproxy ไม่เริ่มต้นเหตุการณ์และฉันมีข้อผิดพลาดดังต่อไปนี้:

    [ALERT] 340/162647 (2241) : parsing [/etc/haproxy/haproxy.cfg:48] 
    : error detected while parsing ACL 'path_acl' : unknown fetch 
    method '%[var' in ACL expression '%[var(txn.path)]'.
    

ฉันจะใช้เส้นทางคำขอเป็น acl เพื่อตั้งหัวข้อการตอบสนองได้อย่างไร

คำตอบ:


9

ลองสิ่งนี้:

http-response set-header Cache-Control no-cache,\ max-age=600 if { capture.req.uri -m beg /api/ }

capture.req.uriยังคงมีอยู่จนกว่าการตอบสนองจะถูกประมวลผลซึ่งไม่เหมือนpathกัน

หมายเหตุเล็กน้อย:

ตัวอย่างนี้ใช้ ACL แบบไม่ระบุชื่อ คุณสามารถทำได้ด้วยชื่อ ACL แต่ใช้เวลา 2 บรรทัด

ไม่มีเหตุผลที่ฉันรู้ว่าทำไมคุณควรเสนอราคาอายุสูงสุด

คุณอาจไม่ต้องการadd-headerคุณต้องการให้set-headerแน่ใจว่าหากมีอยู่แล้วมันจะถูกลบ

acl path_acl %[var(txn.path)] -m ^/api/(.*)$acl path_acl var(txn.path) -m ^/api/(.*)$อาจจะถูกเขียนอย่างถูกต้องตาม HAProxy ค่อนข้างจู้จี้เล็กน้อยเมื่อมันคาดหวัง%[ ]และเมื่อมันไม่ได้ ฉันแน่ใจว่ามีรูปแบบ แต่ฉันไม่ชัดเจนว่ามันคืออะไร


1
ขอขอบคุณสำหรับการตอบสนองของคุณ. วิธีการทั้งสองใช้capture.req.uriและตัวแปรในขณะที่ถอด%[ ]ในacl̀กำลังทำงาน คุณยังต้องเกี่ยวกับคำพูดรอบmax-ageคุ้มค่าและแทนset-header add-header
jmlrt

1
โปรดทราบว่าภายในฉันทำสิ่งที่คล้ายกันถ้าส่วนหลังไม่มีการCache-Controlตอบสนอง: ฉันเพิ่มCache-Control-Authority: implicit, gatewayส่วนหัวเพื่อให้นักพัฒนา / ผู้แก้ปัญหา / ทดสอบหัวขึ้นว่าฉันพร็อกซีกำลังให้ส่วนหัวนั้นไม่ใช่แอปพลิเคชัน แต่แอพสามารถปิดการใช้งานฉันได้โดยเพียงแค่ระบุส่วนหัวของตัวเอง โปรดทราบว่าส่วนหัวนี้ไม่มีอะไรเป็นมาตรฐาน - ฉันเพิ่งทำขึ้นมาเพื่อช่วยให้ผู้อื่นในทีมทราบว่าฉันกำลังจัดเตรียมอินไลน์นี้ไม่ใช่แอป ผู้รับมอบฉันทะไม่มีปัญหาจนพวกเขามีนิสัยไม่ดีที่ลืมว่าพวกเขาอยู่ในเส้นทางทั้งหมด
Michael - sqlbot
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.