Haproxy route and rewrite based on URI path
haproxy, load-balancing, path, regex, url-rewriting
Solution
If I understand you correctly, replace the example below:
reqrep ^([^\ ]\*)\ /([-.0-9A-Za-z]\*)/([a-zA-Z]\*)/(.\*) \1\ /\3-\2/\4
http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#reqrep
reqrep search string [{if | unless} cond]
You have no spaces.
Problem
I am trying to setup an Haproxy to load balance requests on a few backends identified by the uri path. For example: https://www.example.com/v1/catalog/foo/bar Should lead to the "catalog-v1" backends. Thing is each app responds on a different path so I must not only identify the app but rewrite the URL path. E.g. - https://www.example.com/v1/catalog/product - https://www.example.com/v2-2/checkout/cart/123 - https://www.example.com/v3.1.2/checkout/cart TO - https://www.example.com/catalog-v1/product - https://www.example.com/checkout-v2-2/cart/123 - https://www.example.com/checkout-v3.1.2/cart I know I shouldn't use Haproxy for rewriting purposes but for now this is inevitable. Tried the following regex which worked on regex101: ``` ([a-z.]*)\/([a-z0-9\-\.]*)\/([a-z\-]*)\/(.*) ``` Substitution: ``` \1/\3-\2/\4 ``` And finally here's the haproxy.config: ``` global daemon user root group root maxconn 256000 log 127.0.0.1 local0 log 127.0.0.1 local1 notice stats socket /run/haproxy/stats.sock mode 777 level admin defaults log global option dontlognull maxconn 4000 retries 3 timeout connect 5s timeout client 1m timeout server 1m option redispatch balance roundrobin listen stats :8088 mode http stats enable stats uri /haproxy stats refresh 5s backend catalog-v1 mode http option httpchk GET /catalog-v1/ping http-check expect status 200 reqrep ([a-z.]*)\/([a-z0-9\-\.]*)\/([a-z\-]*)\/(.*) \1/\3-\2/\4 server 127.0.0.1:8280_catalog-v1-node01 127.0.0.1:8280 check inter 2s rise 3 fall 2 backend checkout-v1 mode http option httpchk GET /checkout-v1/ping http-check expect status 200 reqrep ([a-z.]*)\/([a-z0-9\-\.]*)\/([a-z\-]*)\/(.*) \1/\3-\2/\4 server 127.0.0.1:8180_checkout-v1-node01 127.0.0.1:8180 check inter 2s rise 3 fall 2 frontend shared-frontend mode http bind localhost:80 acl is-catalog-v1-path path_dir /v1/catalog acl is-checkout-v1-path path_dir /v1/checkout use_backend catalog-v1 if is-catalog-v1-path use_backend checkout-v1 if is-checkout-v1-path ``` Am I missing something? I've been struggling with this for quite some time without success. The backends shows "UP" in Haproxy stats page but everytime I call the "non rewrited url" I get a 400 Bad Request error. Thanks in advance for your help!