Маршрут Haproxy и перезапись на основе пути URI
Я пытаюсь настроить HAProxy для запросов баланса нагрузки на несколько бэкэндов, определенных путем uri. Например:
должны привести к "каталог-В1" бэкэндов.
дело в том, что каждое приложение отвечает по другому пути, поэтому я должен не только идентифицировать приложение, но и переписать путь URL. Е. Г.
- 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
 
до
- 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 знаю, я не должен использовать Haproxy для переписывания, но пока это неизбежно.
пробовал следующее регулярное выражение, которое работало на regex101:
([a-z.]*)/([a-z0-9-.]*)/([a-z-]*)/(.*)
замена:
/-/
и наконец вот к 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-]*)/(.*)   /-/
    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-]*)/(.*)   /-/
    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
Я что-то пропустила?
я боролся с этим в течение некоторого времени без успеха. Бэкэнды показывают "вверх" на странице статистики Haproxy, но каждый раз, когда я вызываю "не перезаписанный url", я получаю 400 Ошибка запроса.
заранее спасибо за вашу помощь!
2 ответов
Если я правильно вас понял, замените пример ниже:
reqrep ^([^\ ]\*)\ /([-.0-9A-Za-z]\*)/([a-zA-Z]\*)/(.\*)  \ /-/
http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#reqrep
reqrep search string [{if | unless} cond]
у вас нет пространства.
ответ выше-это единственное исправление, которое не объясняет корень проблемы. Проблема в том, что многие предполагают, что мы анализируем полный URL-адрес или только компонент пути, когда мы фактически анализируем/переписываем HTTP-заголовки.
например:
curl -iv https://stackoverflow.com/questions/24784517/haproxy-route-and-rewrite-based-on-uri-path
*   Trying 151.101.65.69...
> GET /questions/24784517/haproxy-route-and-rewrite-based-on-uri-path HTTP/1.1
> Host: stackoverflow.com
> User-Agent: curl/7.54.0
> Accept: */*
цель состоит в том, чтобы переписать GET /some_path HTTP/1.1 to GET /some_other_path HTTP/1.1 
Я хочу уточнить, что решение выше работает, потому что оно учитывает http-глагол в матче и замене.  ^([^\ ]\*)\ (.*) для захвата глагола и используйте его в схеме замены.