如何用HAProxy拦截不含指定关键词的URL请求
HAProxy 配置修复:拦截指定查询参数不符合要求的请求
问题根源
你之前的配置用了path_reg,但HAProxy的path_reg仅匹配URL的路径部分(即?之前的内容),查询参数不在这个匹配范围内,所以你的正则规则根本不会触发,导致所有请求都被允许通过。
正确配置方案
要匹配查询参数的值,需要使用HAProxy专门处理查询参数的指令:urlp_reg(基于正则匹配查询参数值)或者结合urlp与字符串判断。
方案一:使用urlp_reg(推荐,支持不区分大小写)
直接匹配urls.primaryName参数的值,若不包含(不区分大小写)Developer则拒绝请求:
frontend http-in acl url_petstore_v2 path_beg -i /swaggerui/PetStore/ use_backend petstore_v2 if url_petstore_v2 backend petstore_v2 # 匹配urls.primaryName的值不包含Developer(不区分大小写)的请求,拒绝 http-request deny if { urlp_reg urls.primaryName -i ^(?!.*Developer).*$ } server petstore1 $PS_HOST$SERVER_ADDRESS_TAIL:$PS_PORT check $TLS_APPEND $HAPROXY_RESOLVER_EXPR
方案二:使用urlp结合! sub
通过字符串包含判断,若urls.primaryName的值不包含Developer(不区分大小写)则拒绝:
frontend http-in acl url_petstore_v2 path_beg -i /swaggerui/PetStore/ use_backend petstore_v2 if url_petstore_v2 backend petstore_v2 # 定义ACL:urls.primaryName的值不包含Developer(不区分大小写) acl primary_name_no_developer urlp(urls.primaryName) -i ! sub Developer # 拒绝符合上述ACL的请求 http-request deny if primary_name_no_developer server petstore1 $PS_HOST$SERVER_ADDRESS_TAIL:$PS_PORT check $TLS_APPEND $HAPROXY_RESOLVER_EXPR
额外说明
- 若需要同时拦截没有
urls.primaryName参数的请求,可以在拒绝条件中添加! urlp_exists urls.primaryName,比如:http-request deny if { ! urlp_exists urls.primaryName } or { urlp_reg urls.primaryName -i ^(?!.*Developer).*$ } - 测试时可以用
curl验证:- 允许的请求:
curl "http://your-domain/swaggerui/PetStore/index.html?urls.primaryName=V1-Developer" - 被拦截的请求:
curl "http://your-domain/swaggerui/PetStore/index.html?urls.primaryName=V1-Private"
- 允许的请求:
内容的提问来源于stack exchange,提问作者Nithin B
相关产品推荐
相关产品推荐

