Episode ini menguasai seni content switching: ekspresi ACL tingkat lanjut, menggabungkan kondisi berbasis host, path, header, dan payload dalam satu keputusan, serta menyusun logika frontend yang kompleks namun tetap mudah dipahami.

Content switching adalah kemampuan memutuskan tujuan berdasarkan isi request — bukan sekadar IP dan port. Di sinilah ACL berubah dari kondisi sederhana menjadi bahasa logika yang lengkap.
Episode 16 membahas ekspresi ACL tingkat lanjut, cara menggabungkan banyak kondisi menjadi satu keputusan, dan bagaimana menyusun logika frontend yang kuat tanpa membuat file konfigurasi sulit dibaca.
ACL bisa memproses nilai asal dengan transformasi. Contoh: membandingkan versi API dari path:
frontend api_front
bind *:443 ssl crt /etc/haproxy/certs/fullchain.pem
mode http
acl api_v1 path_reg ^/v1/
acl api_v2 path_reg ^/v2/
acl is_json req.hdr(Content-Type) -i application/json
use_backend v1_back if api_v1
use_backend v2_back if api_v2
default_backend v1_backacl api_v1 path_reg ^/v1/ memakai regex untuk mencocokkan awalan path. Regex memberi fleksibilitas yang tidak bisa ditawarkan path_beg.
Beberapa keputusan butuh melihat awal body request:
frontend api_front
bind *:80
mode http
acl req_payload_ok req.payload(0,32) -m reg \
"^\s*\{\s*\"name\""
http-request deny deny_status 400 if !req_payload_ok
default_backend api_backreq.payload(0,32) -m reg mengambil 32 byte pertama body dan mencocokkannya dengan pola JSON. Ini contoh content switching berbasis isi sebenarnya.
Transformasi berantai memungkinkan logika yang lebih halus:
frontend web_front
bind *:80
mode http
acl high_priority hdr(priority),lower -m str high
acl small_room hdr(x-body-size),int gt 10000
http-request deny deny_status 413 if !high_priority small_room
default_backend web_backhdr(priority),lower -m str high mengubah header ke huruf kecil lalu membandingkannya; hdr(x-body-size),int gt 10000 mengubah nilai header menjadi integer sebelum dibandingkan.
Kondisi di use_backend dan http-request mendukung or, and, serta !:
frontend web_front
bind *:80
mode http
acl host_app1 hdr(host) -i app1.example.com
acl host_app2 hdr(host) -i app2.example.com
acl is_api path_beg /api
acl is_vip hdr(x-client-type) -i premium
use_backend premium_back if is_vip and is_api
use_backend app1_back if host_app1 and !is_api
use_backend app2_back if host_app2
default_backend web_backuse_backend premium_back if is_vip and is_api memilih backend premium hanya jika dua kondisi benar sekaligus. Urutan dari atas ke bawah membuat request premium selalu dicek lebih dulu.
Beberapa baris dengan nama ACL sama otomatis digabung dengan OR:
frontend web_front
bind *:80
mode http
acl is_admin hdr(host) -i admin.example.com
acl is_admin src 10.0.0.0/8
acl is_admin path_beg /internal
http-request deny deny_status 404 if is_admin path_beg /public
default_backend web_backKarena is_admin didefinisikan tiga kali dengan makna berbeda, ACL tersebut benar jika salah satu definisinya cocok. Ini cara rapi menggabungkan banyak kemungkinan.
Logika frontend yang kompleks tetap harus bisa dibaca manusia. Aturannya:
use_backend dari yang paling spesifik.default_backend di paling bawah.frontend api_front
bind *:443 ssl crt /etc/haproxy/certs/fullchain.pem
mode http
option httplog
acl has_key req.hdr(X-Api-Key) -m found
acl is_v1 path_beg /v1
acl is_v2 path_beg /v2
acl is_internal src 10.0.0.0/8
http-request deny deny_status 401 if !has_key !is_internal
http-request deny deny_status 405 if !is_v1 !is_v2
use_backend v2_back if is_v2 has_key
default_backend v1_backhttp-request deny deny_status 405 if !is_v1 !is_v2 menolak path yang bukan v1 atau v2 sebelum sempat routing. Disiplin urutan ini yang membedakan konfigurasi mudah dipelihara dari kekacauan.
Jebakan yang sering muncul saat ACL makin kompleks:
X-Forwarded-For sendiri.path_reg dengan beberapa request nyata.default_backend hilang sehingga trafik tak terarah ditolak.curl -s -o /dev/null -w "%{http_code}\n" \
-H "X-Api-Key: test" https://localhost/v2/health -k
curl -s -o /dev/null -w "%{http_code}\n" \
https://localhost/v2/health -kcurl -s -o /dev/null -w "%{http_code}\n" dengan dan tanpa header X-Api-Key memverifikasi bahwa aturan deny bekerja seperti yang diharapkan.
Episode 16 mengubah ACL dari sekedar if-then menjadi bahasa logika yang lengkap: regex, konversi nilai, payload, dan kombinasi kondisi. Dengan disiplin urutan, frontend yang kompleks tetap bisa dirawat.
Inti yang harus dibawa pulang:
path_reg, req.payload, dan transformasi nilai memperluas ekspresi ACL.and, or, dan ! dalam satu keputusan.default_backend dan tes logika dengan request nyata.Di episode 17 selanjutnya kita akan membahas HAProxy Enterprise features overview — fitur unggulan edisi Enterprise, arsitektur event-driven dan module tambahan, serta perbandingan feature set antara Community dan Enterprise editions.