Làm cách nào để thêm tiêu đề phản hồi với HAproxy 1.6 dựa trên URI yêu cầu?


9

Tôi sử dụng HAproxy 1.6 làm bộ cân bằng tải trước các máy chủ tomcat.

Tôi cần thêm các tiêu đề phản hồi dựa trên URI yêu cầu.

Ví dụ: tôi muốn thêm tiêu đề phản hồi Cache-Control public,max-age="600"khi uri yêu cầu /apinhưng không phải khi uri yêu cầu là thứ gì đó khác.

  • Thử nghiệm đầu tiên của tôi là sử dụng acl dựa trên đường dẫn để thêm các tiêu đề vào phản hồi http:

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

    Khi tôi bắt đầu haproxy với -d, tôi có cảnh báo nói rằng path_reg(hoặc path) không tương thích với 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'
    
  • Tôi đã cố gắng để thêm tiêu đề http-requestthay vì http-response:

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

    Điều đó đã làm việc nhưng tôi cần nó trong phản ứng

  • Tôi cũng đã thử sử dụng các biến 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
    

    Nhưng khi tôi thử HAproxy không bắt đầu sự kiện và tôi gặp lỗi sau:

    [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)]'.
    

Làm cách nào tôi có thể sử dụng đường dẫn yêu cầu vào acl để đặt tiêu đề phản hồi?

Câu trả lời:


9

Thử cái này:

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

capture.req.uriVẫn tồn tại cho đến khi phản hồi được xử lý, không giống như pathkhông.

Một vài lưu ý:

Ví dụ này sử dụng ACL ẩn danh. Bạn cũng có thể làm điều đó với một ACL có tên, nhưng phải mất 2 dòng.

Không có lý do gì tôi biết lý do tại sao bạn nên trích dẫn giá trị tuổi tối đa.

Bạn có thể không muốn add-header, bạn muốn set-header, điều này đảm bảo rằng nếu một cái đã có sẵn, nó sẽ bị xóa.

acl path_acl %[var(txn.path)] -m ^/api/(.*)$có lẽ được viết chính xác như acl path_acl var(txn.path) -m ^/api/(.*)$. HAProxy là một chút khó khăn về khi nào nó mong đợi %[ ]và khi nào nó không. Tôi chắc chắn có một mô hình, nhưng tôi không rõ đó là gì.


1
Cảm ơn bạn đã phản hồi của bạn. Cả hai phương pháp sử dụng capture.req.urivà các biến đồng thời lấy đi %[ ]trong acl̀đang làm việc. Bạn cũng đúng về các trích dẫn xung quanh max-agegiá trị và set-headerthay vì add-header.
jmlrt 6/12/2016

1
Lưu ý rằng trong nội bộ, tôi làm một cái gì đó tương tự, nếu back-end không cung cấp Cache-Controlphản hồi: Tôi thêm một Cache-Control-Authority: implicit, gatewaytiêu đề để cung cấp cho nhà phát triển / người khắc phục sự cố / người kiểm tra một cái đầu mà tôi, proxy, đang cung cấp tiêu đề đó, không phải ứng dụng , nhưng ứng dụng có thể vô hiệu hóa tôi bằng cách chỉ cần cung cấp tiêu đề của riêng nó. Lưu ý tiêu đề này không có gì chuẩn - tôi chỉ tạo ra nó, để giúp những người khác trong nhóm nhận thức được rằng tôi đang cung cấp nội tuyến này chứ không phải ứng dụng. Các proxy rất rắc rối đến nỗi họ có thói quen xấu là quên đi tất cả.
Michael - sqlbot 7/12/2016
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.