Jak dodać nagłówki odpowiedzi za pomocą HAproxy 1.6 na podstawie identyfikatora URI żądania?

9

Używam HAproxy 1.6 jako modułu równoważenia obciążenia przed serwerami tomcat.

Muszę dodać nagłówki odpowiedzi na podstawie identyfikatora URI żądania.

Na przykład chciałbym dodać nagłówek odpowiedzi, Cache-Control public,max-age="600"gdy identyfikator uri żądania jest, /apiale nie, gdy uri żądania jest czymś innym.

  • Moja pierwsza próba polegała na użyciu acl na podstawie ścieżki, aby dodać nagłówki do odpowiedzi http:

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

    Kiedy zaczynam haproxy -d, ostrzegam, że path_reg(lub path) jest niezgodny z 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'
    
  • Próbowałem dodać nagłówek http-requestzamiast http-response:

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

    To działało, ale potrzebuję go w odpowiedzi

  • Próbowałem także użyć zmiennych 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
    

    Ale kiedy próbuję HAproxy nie rozpoczyna się zdarzenie i pojawia się następujący błąd:

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

Jak mogę użyć ścieżki żądania do pliku acl, aby ustawić nagłówek odpowiedzi?

jmlrt
źródło

Odpowiedzi:

9

Spróbuj tego:

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

capture.req.uritrwa, dopóki odpowiedź nie zostanie przetworzona, w przeciwieństwie do tego path, co nie.

Kilka uwag:

W tym przykładzie użyto anonimowej listy ACL. Możesz to również zrobić z nazwaną listą ACL, ale zajmuje to 2 linie.

Nie ma powodu, dla którego mam świadomość, dlaczego należy podawać wartość maksymalnego wieku.

Prawdopodobnie nie chcesz tego add-header, co chcesz set-header, co zapewnia, że ​​jeśli ktoś już jest obecny, zostanie usunięty.

acl path_acl %[var(txn.path)] -m ^/api/(.*)$jest prawdopodobnie poprawnie napisany jako acl path_acl var(txn.path) -m ^/api/(.*)$. HAProxy jest trochę wybredny, kiedy się spodziewa, %[ ]a kiedy nie. Jestem pewien, że istnieje pewien wzorzec, ale nie jestem jasne, co to jest.

Michael - sqlbot
źródło
1
Dziękuję za odpowiedź. Zarówno metoda z użyciem capture.req.urii podczas usuwania zmiennych %[ ]w acl̀pracy. Masz również rację co do cytatów dotyczących max-agewartości i set-headerzamiast add-header.
jmlrt,
1
Zauważ, że wewnętrznie robię coś podobnego, jeśli zaplecze nie zapewnia Cache-Controlodpowiedzi: dodaję Cache-Control-Authority: implicit, gatewaynagłówek, aby dać programistom / narzędziu do rozwiązywania problemów / testerowi heads-up, że ja, proxy, dostarczam ten nagłówek, a nie aplikację , ale aplikacja może mnie wyłączyć, udostępniając własny nagłówek. Uwaga: ten nagłówek nie jest niczym standardowym - właśnie go wymyśliłem, aby pomóc innym członkom zespołu mieć świadomość, że udostępniam tę aplikację bezpośrednio, a nie aplikację. Pełnomocnicy są tak bezproblemowi, że mają zły nawyk zapominania, że ​​w ogóle są na drodze.
Michael - sqlbot