HAProxy reqrep удалить URI по бэкэнд-запросу

27

очень быстрый вопрос относительно HAProxy reqrep. Я пытаюсь переписать / заменить запрос, который отправляется на сервер.

У меня есть следующий пример домена и URI, оба разделяют одно и то же имя домена, но разные пулы внутреннего веб-сервера.

http://domain/web1
http://domain/web2

Я хочу, чтобы web1 перешел на бэкэнд webfarm1, а web2 - на webfarm2. В настоящее время это происходит. Однако я хочу удалить URI web1 или web2, когда запрос отправляется на сервер.

Вот мой haproxy.cfg

frontend webVIP_80
        mode http
        bind    :80
        #acl routing to backend
        acl web1_path path_beg /web1
        acl web2_path path_beg /web2

        #which backend
        use_backend webfarm1 if web1_path
        use_backend webfarm2 if web2_path
        default_backend webfarm1

backend webfarm1
        mode http
        reqrep ^([^\ ]*)\ /web1/(.*)     \1\ /\2
        balance roundrobin
        option httpchk HEAD /index HTTP/1.1\r\nHost:\ example.com
        server webtest1 10.0.0.10:80 weight 5 check slowstart 5000ms
        server webtest2 10.0.0.20:80 weight 5 check slowstart 5000ms
backend webfarm2
        mode http
        reqrep ^([^\ ]*)\ /web2/(.*)     \1\ /\2
        balance roundrobin
        option httpchk HEAD /index HTTP/1.1\r\nHost:\ example.com
        server webtest1-farm2 10.0.0.110:80 weight 5 check slowstart 5000ms
        server webtest2-farm2 10.0.0.120:80 weight 5 check slowstart 5000ms

Если я захожу http://domain/web1или http://domain/web2вижу в журналах ошибок, что запрос на сервере в каждом бэкэнде, что запрос относится к ресурсу / web1 или / web2 соответственно. Поэтому я считаю, что с моим регулярным выражением что-то не так, хотя я скопировал и вставил его из Документации. http://code.google.com/p/haproxy-docs/wiki/reqrep

Описание: я пытаюсь маршрутизировать трафик на основе URI, однако я хочу, чтобы HAProxy удалял URI при отправке запроса в бэкэнд-пул.

Спасибо!

-Джим

Джим
источник
Теперь есть кнопки редактирования и комментирования.
Крис С
1
Джим, у вас проблемы с комментариями, потому что вы вошли в систему с другой учетной записью, чем вы использовали для создания этого вопроса. Пожалуйста, постарайтесь, чтобы ваша учетная запись была последовательной, чтобы этого не произошло в будущем. Я пометил модератора, чтобы это исправить.
MDMarra

Ответы:

28

У вас есть это:

reqrep ^([^\ ]*)\ /web1/(.*)     \1\ /\2

Я думаю, что вы хотите это:

reqrep ^([^\ ]*\ /)web1[/]?(.*)     \1\2

Разница в том, что второй будет работать, если / после webN опущен.

В ответ на ваш комментарий ниже, вдаваться в подробности о том, как работают приведенные выше выражения, - это больше усилий, чем я могу дать. Однако, возможно, это поможет.

Все до / web1 "захватывает" все, что находится перед web1 в строке запроса. Так что обычно это будет GET или POST. (. *) «Захватывает» все после web1, включая ничего, если ничего нет.

Следующая часть ( \1\2) говорит, что делать с этими захваченными частями. Это говорит, чтобы сформировать строку, состоящую из \1(первая захваченная часть) и \2(сопровождаемая второй захваченной частью). Поскольку web1 никогда не записывается, он не собирается в окончательный вывод.

длинная шея
источник
Что означает \ 1 \ \ 2 \ 3? Что касается документации reqrep, что делает ^ ([^ \] *) \? Вот пример, приведенный на странице документации. # замените "/ static /" на "/" в начале любого пути запроса. reqrep ^ ([^ \] *) \ /static/(.*) \ 1 \ / \ 2
Джим
Прочитав ваш комментарий, я понял, что предложенное мной решение было слишком сложным. Я упростил это.
Longneck
Так что же такое синтаксис reqrep? reqrep {string_2_search_thru} {search_string} {replace_string}? Я запутался как на \ 1 \ \ 2 \ 3?
Джим
Есть ли способ включить это требование в работу, если пользователь помещает / web1 или / web1 /?
Джим
Вы пробовали это?
Longneck