HAProxy reqrep는 백엔드 요청에서 URI를 제거합니다. :80

HAProxy reqrep에 관한 실제 빠른 질문. 백엔드로 전송되는 요청을 다시 쓰거나 바꾸려고합니다.

동일한 도메인 이름을 공유하지만 다른 백엔드 웹 서버 풀을 공유하는 다음 예제 도메인 및 URI가 있습니다.

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

web1은 백엔드 webfarm1로 가고 web2는 webfarm2로 가고 싶습니다. 현재 이것은 일어나고 있습니다. 그러나 요청이 백엔드로 전송되면 web1 또는 web2 URI를 제거하고 싶습니다.

여기 내 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/web2I 오류 로그에서 볼 것을 requst 각각 자원 / WEB1 또는 / Web2입니다위한 것으로 각 백엔드에있는 서버에 요청. 따라서 문서에서 복사하여 붙여 넣었지만 정규 표현식에 문제가 있다고 생각합니다. http://code.google.com/p/haproxy-docs/wiki/reqrep

요약 : URI를 기반으로 트래픽을 라우팅하려고하지만 요청을 백엔드 풀로 보낼 때 HAProxy가 URI를 제거하기를 원합니다.

고맙습니다!



답변

당신은 이것을 가지고 있습니다 :

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

나는 당신이 이것을 원한다고 생각합니다 :

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

차이점은 webN 후 /가 생략되면 두 번째 것이 작동한다는 것입니다.

아래의 의견에 대한 답변으로 위의 표현이 어떻게 작동하는지에 대해 자세히 설명하십시오. 그러나 이것이 도움이 될 것입니다.

/ web1 이전의 모든 것은 요청 문자열에서 web1 이전의 모든 것을 “캡처”합니다. 일반적으로 GET 또는 POST입니다. (. *)는 아무것도 없으면 아무것도 포함하지 않고 web1 이후의 모든 것을 “캡처”합니다.

다음 부분 ( \1\2)은 캡처 된 부분으로 수행 할 작업을 나타냅니다. \1(첫 번째 캡처 된 부분)과 \2(두 번째 캡처 된 부분이 뒤 따르는 ) 문자열로 구성되어 있습니다. web1은 캡처되지 않으므로 최종 출력으로 어셈블되지 않습니다.


답변

이것을 프론트 엔드에 놓으십시오

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

좋은 교훈은 문자열을 제거하는 방법을 배우십시오 : https://gist.github.com/PiBa-NL/8ad6c222354cbd7a5af5


답변