我们使用以下内容将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动态识别查询字符串,并在重定向时传递它吗?
答案 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 }
您的地图文件只是路径。