Як додати заголовки відповідей з HAproxy 1.6 на основі URI запиту?


9

Я використовую HAproxy 1.6 як балансир завантаження перед серверами 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.