排除不同路径上的标头

时间:2017-11-13 20:01:50

标签: http-headers acl haproxy

我正在运行haproxy 1.6.3并且我在前端设置了X-Frame-Origin标头。我只是遇到了在iframe中加载网站并且由于该标头而阻止内容的情况。我试图设置一个如下所示的acl规则:

acl is_embeded path_beg /?embeded=1
http-response set-header x-frame-options "SAMEORIGIN" if !is_embeded

当我运行haproxy -f /etc/haproxy/haproxy.conf -c时出现以下错误:

[WARNING] 316/145915 (23701) : parsing [/etc/haproxy/haproxy.cfg:42] : acl 'is_embeded' will never match because it only involves keywords that are incompatible with 'frontend http-response header rule'

有没有办法让这项工作?

2 个答案:

答案 0 :(得分:1)

因为您在响应阶段使用请求acl。

你需要像这样敲击网址:

http-request set-var(txn.urlEmbeded) url
acl is_embeded var(txn.urlEmbeded) -m beg /?embeded=1
http-response set-header x-frame-options "SAMEORIGIN" if !is_embeded

你也在使用路径,它不包括查询。您可能需要使用urlquery(嵌入)found方法。你明白了。

答案 1 :(得分:1)

你正在做的事实上有两个问题。

首先,path提取仅在请求处理期间可用 - 而不是响应处理。这就是警告的原因。 ?没有分配自己的缓冲区 - 只要它被评估,fetch就会从待处理的请求缓冲区中提取它,并且一旦请求有请求缓冲区就会被释放已被发送到服务器。

其次,以capture.req.uri开头的所有内容都是不是路径的一部分。这是查询字符串。

acl is_embeded capture.req.uri -m beg /?embeded=1 是要使用的正确提取,因为它包含路径和查询字符串,并且由于为其分配了内存缓冲区,因此它在请求处理期间保持不变。

capture.req.uri
  

path

     

这将提取请求的URI,该URI从第一个斜杠开始,在请求中的第一个空格之前结束(没有主机部分)。与urlembedded不同,它可以在请求和响应中使用,因为它已被分配。

     

http://cbonte.github.io/haproxy-dconv/1.6/configuration.html#7.3.6-capture.req.uri

另请注意单词{{1}}的正确拼写。