使用HAProxy重定向URL路径并保留查询字符串

时间:2018-02-27 05:37:49

标签: haproxy

我们使用以下内容将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-by-category路径传递查询字符串。 E.g:

/shop-by-category?testingquerystring=test

这不会重定向。

我尝试将我认为是HAProxy查询变量的内容添加到重定向地图中,如:

/shop-by-category&%[query] /parts&%[query]

但是HAProxy似乎没有在地图文件中识别出这一点。有什么方法可以让HAProxy动态识别查询字符串,并在重定向时传递它吗?

1 个答案:

答案 0 :(得分:4)

我有理由相信你不能在地图文件中使用提取 - 它是静态的,并且在启动时加载,因此不能插入任何内容。

capture.req.uri是指RFC意义上的URI:

  

capture.req.uri : string

     

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

...所以听起来你应该使用path fetch进行匹配,并在重写中使用query fetch(如果已设置)。

  

path : string

     

这将提取请求的URL路径,该路径从第一个斜杠开始   在问号前结束(没有主持人部分)。

     

query : string

     

这将提取请求的查询字符串,该字符串在第一个之后开始   问号。如果不存在问号,则此提取不返回任何内容。如果   一个问号存在但没有任何后跟,它返回一个空字符串。   这意味着可以容易地知道查询字符串是否存在   使用"找到"匹配方法。这个获取是"路径"的补充。   在问号之前停止。

然后需要两行匹配和重写。

首先,如果查询字符串存在则重写:

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 }

您的地图文件只是路径。