【问题标题】:Redirecting URL paths with HAProxy and retaining Query Strings使用 HAProxy 重定向 URL 路径并保留查询字符串
【发布时间】:2018-02-27 05:37:49
【问题描述】:

我们使用以下内容将 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 路径传递查询字符串时。例如:

/shop-by-category?testingquerystring=test

这不会重定向。

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

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

但 HAProxy 似乎无法在地图文件中识别这一点。有什么方法可以让 HAProxy 动态识别查询字符串并在重定向时通过它?

【问题讨论】:

    标签: haproxy


    【解决方案1】:

    我有理由确定您不能在地图文件中使用 fetches - 它是静态的,并且在启动时加载,因此无法插入任何内容。

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

    capture.req.uri : string

    这会提取请求的 URI,它从第一个斜杠开始并结束 在请求中的第一个空格之前(没有主机部分)。不像“path” 和“url”,它可以用于请求和响应,因为它是 已分配。

    ...所以听起来您应该使用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 }
    

    您的地图文件将只是路径。

    【讨论】:

    • 效果很好,也很有意义,我假设地图文件将与变量一起加载,并且将继续以这种方式读取它们。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 2015-03-30
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 2017-04-25
    相关资源
    最近更新 更多