HAProxy reqrepは、バックエンド要求でURIを削除します


27

HAProxy reqrepに関する簡単な質問。バックエンドに送信されるリクエストを書き換え/置き換えようとしています。

次のサンプルドメインとURIがあり、両方とも同じドメイン名を共有していますが、バックエンドWebサーバープールが異なります。

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/web2要求が各バックエンドのサーバーで要求されていることをエラーログで確認した場合、要求はそれぞれリソース/ web1または/ web2に対するものです。したがって、ドキュメンテーションからコピーして貼り付けたにもかかわらず、正規表現に何か問題があると思います。http://code.google.com/p/haproxy-docs/wiki/reqrep

概要:URIに基づいてトラフィックをルーティングしようとしていますが、バックエンドプールにリクエストを送信するときにHAProxyがURIを削除するようにしたいのです。

ありがとうございました!

-ジム


現在、編集ボタンとコメントボタンがあります。
クリスS

1
ジム、この質問の作成に使用したアカウントとは異なるアカウントでログインしているため、コメントに問題があります。これが今後発生しないように、ログインアカウントの一貫性を保ってください。これを修正するためにモデレーターにフラグを立てました。
-MDMarra

回答:


28

あなたはこれを持っています:

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

これが欲しいと思う:

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

違いは、webNの後の/が省略された場合、2番目のものが機能することです。

以下のコメントへの回答では、上記の式がどのように機能するかについて詳しく説明するのは、私ができる以上の努力です。ただし、これが役立つ場合があります。

/ web1の前のすべてが、要求文字列でweb1の前にあるすべてを「キャプチャ」しています。そのため、通常はGETまたはPOSTになります。(。*)は、web1の後のすべてを「キャプチャ」します。

次の部分(\1\2)は、これらのキャプチャされた部分をどうするかを示しています。\1(最初にキャプチャされた部分)と\2(2番目にキャプチャされた部分が続く)で構成される文字列を形成するように指示します。web1はキャプチャされないため、最終出力に組み込まれません。


\ 1 \ \ 2 \ 3は何を意味しますか?reqrepドキュメントに関して、^([^ \] *)\は何をしますか?ドキュメントページに記載されている例を次に示します。#リクエストパスの先頭にある「/ static /」を「/」に置き換えます。reqrep ^([^ \] *)\ /static/(.*)\ 1 \ / \ 2
Jim

あなたのコメントを読んだ後、私が提案した解決策はやや複雑すぎることに気付きました。単純化しました。
ロングネック

それでは、reqrep構文とは何ですか?reqrep {string_2_search_thru} {search_string} {replace_string}?\ 1 \ \ 2 \ 3について混乱していますか?
ジム

ユーザーが/ web1または/ web1 /を配置した場合にこのreqrepが機能するように組み込む方法はありますか?
ジム

やってみた?
ロングネック

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.