HAProxy reqrep不替换url中的字符串

时间:2016-12-05 11:10:26

标签: haproxy

我们已弃用某些在http://localhost/test下可用的软件,现在可在http://localhost/app/testing下使用。我们正在使用HAProxy 1.4

因此,我希望通过haproxy将/test的所有网址替换为/app/testing/。我首先使用redirect prefix尝试保留查询字符串,但未将/test从网址中删除,并使用/app/testing/test/?id=x

frontend all
    bind  0.0.0.0:80
    timeout client 86400000
    acl is_test path_beg /test
    redirect prefix /app/testing code 301 if is_test

然后使用reqrep,它似乎重定向到新软件,但网址中的/test字符串永远不会被替换。

frontend all
    bind  0.0.0.0:80
    timeout client 86400000
    reqrep ^([^\ :]*)\ /test[/]?(.*)  \1\ /app/testing/\2

2 个答案:

答案 0 :(得分:2)

由于版本1.4不能重写网址,我们也不想更新HAProxy,我们继续使用reqrep并保持旧链接

reqrep ^([^\ :]*)\ /test[/]?(.*)  \1\ /app/testing/\2

答案 1 :(得分:1)

使用redirect prefix意味着,通过HAProxy示例,更多的是更改主机名,但保留路径。例如,http://apple.com/my/path可以通过以下方式重定向到http://orange.com/my/path

redirect prefix http://orange.com if apple

HAProxy 1.4 docs说:

  

使用"重定向前缀","位置"标头是由   串联的< pfx>和完整的URI路径

对我来说,这表明你会期待你为&#34;前缀&#34;将以路径中已有的为前缀。这解释了你所看到的行为。这对于更改到新域(例如从 apple.com orange.com )非常有用,但保留原始路径(例如 / my / path < / em>的)。

您可以切换到使用redirect location来替换整个网址。以下内容会将http://apple.com/my/path重定向到http://orange.com/path

redirect location http://orange.com/path if apple

更新:

如果您想更改网址但保留查询字符串,请使用reqirepreqrep重写网址,同时还要设置{{1}进入redirect prefix。该URL将被重写,然后用户将被重定向到它,以便他们看到它。

您可以设置&#34;前缀&#34;到&#34; /&#34;。 HAProxy文档说:

  

作为特例,如果&lt; pfx&gt;完全等于&#34; /&#34;,然后什么也没有   在原始URI之前插入。它允许一个人重定向到   相同的URL(例如,插入cookie)。

使用您的代码示例,如下所示:

frontend