HAProxy reqrep menghapus URI atas permintaan backend

27

pertanyaan cepat nyata tentang HAProxy reqrep. Saya mencoba menulis ulang / mengganti permintaan yang dikirimkan ke backend.

Saya memiliki contoh domain dan URI berikut, keduanya berbagi nama domain yang sama, tetapi kumpulan server web backend yang berbeda.

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

Saya ingin web1 pergi ke backend webfarm1, dan web2 pergi ke webfarm2. Saat ini memang terjadi. Namun saya ingin menghapus URI web1 atau web2 ketika permintaan dikirim ke backend.

Ini haproxy.cfg saya

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

Jika saya pergi ke http://domain/web1atau http://domain/web2saya melihatnya di log kesalahan bahwa permintaan pada server di backend masing-masing bahwa requst adalah untuk sumber daya / web1 atau / web2 masing-masing. Karena itu saya percaya ada sesuatu yang salah dengan ekspresi reguler saya, meskipun saya menyalin dan menempelnya dari Dokumentasi. http://code.google.com/p/haproxy-docs/wiki/reqrep

Rangkuman: Saya mencoba merutekan lalu lintas berdasarkan URI, namun saya ingin HAProxy menghapus URI saat mengirim permintaan ke kumpulan backend.

Terima kasih!

-Jim

Jim
sumber
Ada tombol edit dan komentar sekarang.
Chris S
1
Jim, Anda mengalami masalah saat berkomentar karena Anda masuk dengan akun yang berbeda dari yang Anda gunakan saat membuat pertanyaan ini. Silakan coba dan pertahankan akun login Anda agar tidak terjadi lagi di masa depan. Saya telah menandai moderator untuk memperbaikinya.
MDMarra

Jawaban:

28

Kamu punya ini:

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

Saya pikir Anda menginginkan ini:

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

Perbedaannya adalah bahwa yang kedua akan berfungsi jika / setelah webN dihilangkan.

Sebagai jawaban atas komentar Anda di bawah ini, masuk ke detail tentang bagaimana ekspresi di atas bekerja lebih keras daripada yang bisa saya berikan. Namun, mungkin ini akan membantu.

Semuanya sebelum / web1 adalah "menangkap" segala sesuatu yang datang sebelum web1 dalam string permintaan. Jadi biasanya itu akan GET atau POST. The (. *) "Menangkap" semuanya setelah web1, termasuk tidak ada jika tidak ada.

Bagian selanjutnya ( \1\2) mengatakan apa yang harus dilakukan dengan bagian-bagian yang ditangkap. Dikatakan untuk membentuk string yang terdiri dari \1(bagian yang ditangkap pertama) dan \2(diikuti oleh bagian yang ditangkap kedua). Karena web1 tidak pernah ditangkap, itu tidak dirakit ke hasil akhir.

leher panjang
sumber
Apa yang dimaksud dengan \ 1 \ \ 2 \ 3? Mengenai dokumentasi reqrep, apa yang dilakukan ^ ([^ \] *) \? Ini adalah contoh yang diberikan pada halaman dokumentasi. # ganti "/ static /" dengan "/" di awal setiap jalur permintaan. reqrep ^ ([^ \] *) \ /static/(.*) \ 1 \ / \ 2
Jim
Setelah membaca komentar Anda, saya menyadari bahwa solusi yang saya usulkan sedikit terlalu rumit. Saya menyederhanakannya.
longneck
Jadi apa sintaks reqrep? reqrep {string_2_search_thru} {search_string} {replace_string}? Saya bingung dengan \ 1 \ \ 2 \ 3?
Jim
Apakah ada cara untuk menggabungkan reqrep ini agar berfungsi jika pengguna meletakkan / web1 atau / web1 /?
Jim
Apakah kamu sudah mencobanya?
longneck