¿Cómo agregar encabezados de respuesta con HAproxy 1.6 basado en el URI de solicitud?

9

Uso HAproxy 1.6 como equilibrador de carga frente a los servidores Tomcat.

Necesito agregar encabezados de respuesta basados ​​en el URI de solicitud.

Por ejemplo, me gustaría agregar el encabezado de respuesta Cache-Control public,max-age="600"cuando la uri de la solicitud es /apipero no cuando la uri de la solicitud es otra cosa.

  • Mi primer intento fue usar acl basado en la ruta para agregar los encabezados a la respuesta http:

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

    Cuando empiezo con haproxy -d, tengo una advertencia que dice que path_reg(o path) es incompatible con 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'
    
  • Traté de agregar el encabezado en http-requestlugar de http-response:

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

    Eso funcionó pero lo necesito en la respuesta

  • También intenté usar variables 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
    

    Pero cuando intento que HAproxy no se inicie y tengo el siguiente error:

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

¿Cómo puedo usar la ruta de solicitud en una acl para establecer el encabezado de respuesta?

jmlrt
fuente

Respuestas:

9

Prueba esto:

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

capture.req.uripersiste hasta que se procesa la respuesta, a diferencia de pathlo que no.

Algunas notas

Este ejemplo usa una ACL anónima. También podría hacerlo con una ACL con nombre, pero eso requiere 2 líneas.

No hay ninguna razón por la que sepa por qué debe citar el valor de edad máxima.

Probablemente no desee hacerlo add-header, lo set-headerque garantiza que si ya hay uno presente, se eliminará.

acl path_acl %[var(txn.path)] -m ^/api/(.*)$probablemente esté correctamente escrito como acl path_acl var(txn.path) -m ^/api/(.*)$. HAProxy es un poco quisquilloso sobre cuándo espera %[ ]y cuándo no. Estoy seguro de que hay un patrón, pero no estoy claro qué es.

Michael - sqlbot
fuente
1
Gracias por su respuesta. Tanto el método que utiliza capture.req.uriy las variables mientras se quita %[ ]en acl̀están trabajando. También tiene razón acerca de las citas en torno al max-agevalor y en set-headerlugar de add-header.
jmlrt
1
Tenga en cuenta que internamente, hago algo similar, si el back-end no proporciona una Cache-Controlrespuesta: agrego un Cache-Control-Authority: implicit, gatewayencabezado para darle al desarrollador / solucionador de problemas / probador un aviso que yo, el proxy, estoy proporcionando ese encabezado, no la aplicación , pero la aplicación puede deshabilitarme simplemente proporcionando su propio encabezado. Tenga en cuenta que este encabezado no es nada estándar: lo inventé para ayudar a otros miembros del equipo a saber que estaba proporcionando esto en línea, no la aplicación. Los proxies están tan libres de problemas que tienen la mala costumbre de olvidar que están en el camino.
Michael - sqlbot