Я использую 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 для установки заголовка ответа?
Попробуй это:
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 немного привередлив в том, когда он ожидает %[ ]
а когда нет. Я уверен, что есть закономерность, но я не совсем понимаю, что это такое.