HAProxy reqrep not replacing string in url

巧了我就是萌 提交于 2019-12-07 11:54:37

问题


We have deprecated some software which was available under http://localhost/test and is now available under http://localhost/app/testing. We are using HAProxy 1.4

Thus, I want via haproxy, to replace all urls containing /test with /app/testing/. I tried first with a redirect prefix in order to keep the query string, but /test wasn't removed from the url and had something like /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

Then used a reqrep, which seems to redirect to the new software, but the /test string in the url is never replaced.

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

回答1:


Since url rewriting isn't possible with version 1.4 and we didn't want to update HAProxy, we went on using reqrep and keeping the old link as is with

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



回答2:


Try this
This works for me with your scenario on HAProxy 1.6

 acl test     path_beg -i /test
 http-request set-header         X-Location-Path %[capture.req.uri] if test
 http-request replace-header     X-Location-Path /test /app/testing if test
 http-request redirect location  %[hdr(X-Location-Path)] if test
 use_backend WHEREVER            if test



回答3:


Using redirect prefix is meant, going by the HAProxy examples, more for changing the hostname, but keeping the path. For example, http://apple.com/my/path could be redirected to http://orange.com/my/path with:

redirect prefix http://orange.com if apple

The HAProxy 1.4 docs say:

With "redirect prefix", the "Location" header is built from the concatenation of < pfx > and the complete URI path

To me, that suggests that you would expect whatever you put for the "prefix" will be prefixed to what was already in the path. That explains the behavior you were seeing. This is useful for changing to a new domain (e.g. from apple.com to orange.com), but keeping the original path (e.g. /my/path).

You can switch to using redirect location to replace the entire URL. The following would redirect http://apple.com/my/path to http://orange.com/path:

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

UPDATE:

In the case where you want to change the URL, but keep the query string, use reqirep or reqrep to rewrite the URL, as you are doing, but also put a redirect prefix into the frontend. The URL will be rewritten and then the user will be redirected to it so they see it.

You might be able to set the "prefix" to "/". The HAProxy docs say:

As a special case, if < pfx > equals exactly "/", then nothing is inserted before the original URI. It allows one to redirect to the same URL (for instance, to insert a cookie).

Using your code example, something like this:

reqrep ^([^\ :]*)\ /test[/]?(.*)  \1\ /app/testing/\2
redirect prefix / code 301 if is_test


来源:https://stackoverflow.com/questions/40972885/haproxy-reqrep-not-replacing-string-in-url

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!