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/web1
atau http://domain/web2
saya 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
Jawaban:
Kamu punya ini:
Saya pikir Anda menginginkan ini:
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.sumber
Letakkan ini di frontend
Pelajaran bagus belajar menelanjangi string: https://gist.github.com/PiBa-NL/8ad6c222354cbd7a5af5
sumber