使用 HAproxy 添加 header 到特定 URL 的响应

Adding header to response for specific URLs with HAproxy

我的 HAproxy 配置中有一个简单的条件(我为 frontendbackend 试过):

acl no_index_url path_end .pdf .doc .xls .docx .xlsx
rspadd X-Robots-Tag:\ noindex if no_index_url

它应该将 no-robots header 添加到不应被索引的内容。但是它在解析配置时给了我这个WARNING

acl 'no_index_url' will never match because it only involves keywords
    that are incompatible with 'backend http-response header rule'

acl 'no_index_url' will never match because it only involves keywords
    that are incompatible with 'frontend http-response header rule'

根据 documentationrspadd 可用于 前端 后端 path_end 用于 frontend 中的示例。为什么我会收到此错误,这是什么意思?

显然,即使有警告,前端中的 acl 也能正常工作。所有带有 .pdf、.doc 等的资源都得到了正确的 X-Robots-Tag 添加。

换句话说,这个 WARNING 具有误导性,实际上 acl 匹配。

从 HaProxy 1.6 开始,您将无法忽略错误消息。要使其正常工作,请使用临时变量功能:

frontend main
   http-request set-var(txn.path) path

backend local
   http-response set-header X-Robots-Tag noindex if { var(txn.path) -m end .pdf .doc }

如果使用 v1.6 以下的 haproxy,创建一个新的后端块(可以是默认后端的副本)并在其中添加特殊的 headers。然后在前端有条件地使用该后端。即

use_backend alt_backend if { some_condition } 

诚然这不是一个理想的解决方案,但它确实可以。