HAProxy从1.9升级到2.4:rspirep替换正则配置报错求助
HAProxy 2.4中
http-response replace-value配置错误分析 问题根源
你混淆了rspirep和http-response replace-value的参数结构,导致正则语法解析失败。
指令参数差异
- 原
rspirep指令:针对整个响应头行做匹配替换,语法为rspirep <匹配整个头行的正则> <替换后的完整头行> [条件]。你的原配置里,正则^Location:\ http://(.*)匹配完整的Location: http://xxx头行,替换成Location: https://\1,逻辑是成立的。 http-response replace-value指令:仅针对指定头字段的数值部分单独处理,语法为http-response replace-value <头字段名> <匹配头值的正则> <替换字符串> [条件]。它不需要在正则里包含头字段名(比如Location:),只需要处理头字段的具体值内容。
你的错误配置解析
你写的配置:
http-response replace-value Location:\ http://(.*) https://\1 if hdr_location
HAProxy会把Location:\ http://(.*)识别为要操作的头字段名(这显然不符合规范),然后把https://\1当成了匹配头值的正则。而这个“正则”里的\1没有对应的捕获组(前面根本没定义括号捕获内容),所以触发了reference to non-existent subpattern错误。
正确配置写法
保留原ACL,替换指令修改为:
acl hdr_location res.hdr(Location) -m found http-response replace-value Location ^http://(.*)$ https://\1 if hdr_location
- 第一个参数
Location明确指定要修改的响应头字段 - 第二个参数
^http://(.*)$只匹配该头字段的值(即http://xxx部分),捕获http://之后的内容 - 第三个参数
https://\1用捕获到的内容替换,实现http转https的需求
内容的提问来源于stack exchange,提问作者downeyspence
相关产品推荐
相关产品推荐

