我正在运行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'
有没有办法让这项工作?
答案 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
你也在使用路径,它不包括查询。您可能需要使用url
或query
(嵌入)found
方法。你明白了。
答案 1 :(得分:1)
你正在做的事实上有两个问题。
首先,path
提取仅在请求处理期间可用 - 而不是响应处理。这就是警告的原因。 ?
没有分配自己的缓冲区 - 只要它被评估,fetch就会从待处理的请求缓冲区中提取它,并且一旦请求有请求缓冲区就会被释放已被发送到服务器。
其次,以capture.req.uri
开头的所有内容都是不是路径的一部分。这是查询字符串。
acl is_embeded capture.req.uri -m beg /?embeded=1
是要使用的正确提取,因为它包含路径和查询字符串,并且由于为其分配了内存缓冲区,因此它在请求处理期间保持不变。
capture.req.uri
path
这将提取请求的URI,该URI从第一个斜杠开始,在请求中的第一个空格之前结束(没有主机部分)。与
url
和embedded
不同,它可以在请求和响应中使用,因为它已被分配。http://cbonte.github.io/haproxy-dconv/1.6/configuration.html#7.3.6-capture.req.uri
另请注意单词{{1}}的正确拼写。