Episode ini memperdalam router dan rule Traefik: sintaks rule, semua matcher seperti Host, HostRegexp, Path, PathPrefix, Method, Headers, dan Query, operator logika AND, OR, dan NOT, contoh rule kompleks, serta aturan priority otomatis dan manual untuk menyelesaikan konflik routing.

Router adalah unit pengambilan keputusan Traefik, dan rule adalah bahasanya. Episode 6 mengajarkan kalian berbicara bahasa itu dengan fasih: semua matcher yang tersedia, cara menggabungkannya dengan operator logika, serta bagaimana Traefik memutuskan router mana yang menang ketika beberapa rule saling tumpang tindih.
Penguasaan rule adalah keterampilan yang paling sering membedakan konfigurasi Traefik yang rapuh dari yang kokoh. Banyak insiden produksi dimulai dari rule yang terlalu longgar atau priority yang salah. Mari kita bangun fondasi yang benar sejak awal.
Router terdiri dari nama, rule, entrypoint yang dilayani, service tujuan, dan middleware opsional. Sintaksnya konsisten baik lewat labels Docker maupun file provider:
services:
web:
image: nginx:alpine
labels:
- traefik.enable=true
- traefik.http.routers.web.rule=Host(`web.localhost`)
- traefik.http.routers.web.entrypoints=web
- traefik.http.routers.web.service=web-svc
- traefik.http.routers.web.middlewares=compress
- traefik.http.services.web-svc.loadbalancer.server.port=80Semua bagian router dapat diidentifikasi dari traefik.http.routers.web.*. Versi file provider akan tampak identik dengan struktur YAML yang lebih eksplisit — kita akan melihatnya di episode 19.
Host(app.example.com): mencocokkan nama host persis.Host(example.com, www.example.com): menerima beberapa host dalam satu rule.HostRegexp({subdomain:[a-z]+}.example.com) — bentuk {nama:pola} adalah named capture.Path(/api): cocok hanya untuk path persis /api.Path(/api, /v2/api): menerima daftar path.PathPrefix(/api): cocok untuk /api, /api/users, dan seterusnya — paling sering dipakai.Method(GET, POST): membatasi method HTTP.Headers(X-Token, abc123): mencocokkan nilai header spesifik.Query(page, 1): mencocokkan query parameter spesifik.Semua matcher ini bisa dipakai dalam satu rule dengan operator logika. Traefik mengevaluasi rule dengan matcher yang benar-benar memetakan ke permintaan nyata — kecepatan evaluasi praktis tidak terasa perbedaannya.
Traefik mendukung tiga operator:
&& untuk AND: semua kondisi harus terpenuhi.|| untuk OR: salah satu kondisi cukup.! untuk NOT: membalik hasil kondisi.() untuk mengelompokkan prioritas evaluasi.Contoh penggunaan operator yang benar dan salah:
Host(`api.localhost`) && PathPrefix(`/v1`)
Host(`a.localhost`) || Host(`b.localhost`)
Host(`admin.localhost`) && !PathPrefix(`/public`)
(Host(`api.localhost`) && PathPrefix(`/v1`)) || Path(`/ping`)Perhatikan operator ditulis di antara matcher, bukan di dalam matcher. Sintaks di dalam backtick matcher tidak menerima operator — misalnya Host(a.localhost || b.localhost) adalah salah. Matcher Host yang ingin menerima beberapa domain menuliskannya dengan koma, bukan operator OR.
Berikut pola yang sering dipakai di lapangan:
services:
app:
image: myapp:latest
labels:
- traefik.enable=true
- traefik.http.routers.app.rule=(Host(`app.example.com`) || Host(`app.internal`)) && PathPrefix(`/`)
- traefik.http.routers.app.entrypoints=web
- traefik.http.routers.app.service=app-svc
- traefik.http.services.app-svc.loadbalancer.server.port=8080
admin:
image: myadmin:latest
labels:
- traefik.enable=true
- traefik.http.routers.admin.rule=Host(`admin.example.com`) && Headers(`X-Admin`, `true`)
- traefik.http.routers.admin.entrypoints=web
- traefik.http.routers.admin.service=admin-svc
- traefik.http.services.admin-svc.loadbalancer.server.port=9000Router app melayani dua domain sekaligus, sedangkan router admin hanya aktif jika host benar dan header X-Admin bernilai true. Kombinasi semacam ini memungkinkan layanan yang sama dirutekan secara berbeda untuk segmen pengguna yang berbeda.
Ketika dua router memiliki rule yang sama-sama cocok, Traefik memilih berdasarkan priority. Secara otomatis, priority dihitung dari jumlah karakter pada rule: rule yang lebih spesifik (lebih panjang) menang. Contoh: PathPrefix(/api/v2) otomatis menang atas PathPrefix(/api).
Namun kadang penghitungan otomatis tidak sesuai harapan. Kalian bisa menimpa dengan label priority — di bawah ini kita set label traefik.http.routers.special.priority menjadi nilai manual:
labels:
- traefik.enable=true
- traefik.http.routers.special.rule=PathPrefix(`/api/v2`)
- traefik.http.routers.special.priority=100
- traefik.http.routers.special.service=special-svc
- traefik.http.services.special-svc.loadbalancer.server.port=3000Rule di atas menang atas router /api lainnya berapa pun panjang rule-nya, selama keduanya cocok. Prioritas manual adalah cara paling jelas mengontrol konflik — gunakan dengan konsisten agar tidak membingungkan tim.
Tip
Saat dua router cocok dan punya priority sama, Traefik memilih berdasarkan urutan abjad nama router. Jangan pernah bergantung pada perilaku ini — selalu atur priority secara eksplisit untuk rute yang saling tumpang tindih.
Inti yang harus dibawa pulang:
&&, ||, !, dan tanda kurung menggabungkan beberapa kondisi.priority.Di episode 7 selanjutnya kita akan membahas services & load balancing — tipe service HTTP, TCP, dan UDP, server definitions, weight distribution, sticky sessions, health checks, algoritma load balancing, serta service mirroring untuk traffic shadowing dan canary.