我们使用以下方法将一个URL映射文件加载到HAProxy中:
http-request redirect location %[capture.req.uri,map(/etc/haproxy/redirects.map)] code 301 if { capture.req.uri,map(/etc/haproxy/redirects.map) -m found }地图文件中一行的示例如下:
/shop-by-category /products此重定向工作如出一辙。我所遇到的唯一问题是当一个查询字符串与/shop逐个类别的路径一起传递时。例如:
/shop-by-category?testingquerystring=test这不会改变方向。
我尝试将我认为是HAProxy查询变量的内容添加到重定向映射中,如下所示:
/shop-by-category&%[query] /parts&%[query]但是HAProxy在地图文件中似乎没有识别出这一点。有没有办法让HAProxy动态识别查询字符串,并在它重定向时传递它?
发布于 2018-02-27 12:18:57
我可以相当肯定的是,您不能使用映射文件中的获取--它是静态的,在启动时加载,所以什么都不能内插。
capture.req.uri指的是RFC意义上的URI:
capture.req.uri : string这将提取请求的URI,该URI从第一个斜杠开始,在请求中的第一个空格之前结束(没有主机部分)。与"path“和"url”不同,它既可以用于请求,也可以用于响应,因为它是分配的。
...so --听起来应该使用path fetch进行匹配,如果设置好了,则应该使用重写中的query提取。
path : string这将提取请求的URL路径,该路径从第一个斜杠开始,结束于问号之前(没有主机部分)。query : string这将提取请求的查询字符串,该查询字符串在第一个问号之后开始。如果没有问号,则此fetch将不返回任何内容。如果存在问号,但后面没有任何问号,则返回空字符串。这意味着使用“查找”匹配方法可以很容易地知道查询字符串是否存在。这个fetch是"path“的补充,它在问号之前停止。
然后需要两行进行匹配和重写。
首先,如果存在查询字符串,则进行重写:
http-request redirect location %[path,map(/etc/haproxy/redirects.map)]?%[query] code 301 if { path,map(/etc/haproxy/redirects.map) -m found } { query -m found }然后,如果缺少查询字符串,则进行重写:
http-request redirect location %[path,map(/etc/haproxy/redirects.map)] code 301 if { path,map(/etc/haproxy/redirects.map) -m found } ! { query -m found }您的地图文件将仅为路径。
https://stackoverflow.com/questions/49001819
复制相似问题