Episode ini membedah matcher di Caddy: konsep kriteria request, matcher standar seperti path, method, header, host, query, dan remote_ip, sintaks inline dan named, path matching dengan prefix, wildcard, dan regex, serta kombinasi matcher lanjutan.

Matcher adalah jantung routing di Caddy. Tanpa matcher, setiap directive berlaku untuk semua request. Dengan matcher, kalian bisa berkata: "hanya proxy request POST ke /api", "hanya redirect pengunjung dari luar negeri", atau "hanya proses file .php". Episode 11 membedah matcher secara menyeluruh.
Matcher mengevaluasi sifat request: path, method, header, host, dan lainnya. Contoh sederhana — hanya tangani POST:
example.com {
@post {
method POST
}
respond @post "Ini request POST" 200
}Contoh: matcher dengan method OR:
@metode {
method POST
method PUT
}Matcher paling sering dipakai:
@api {
path /api/*
method GET POST
}
example.com {
handle @api {
reverse_proxy localhost:8080
}
handle {
root * /var/www
file_server
}
}Matcher lain yang sering dipakai:
@bot {
header User-Agent *curl*
}
@internal {
remote_ip 192.168.1.0/24 10.0.0.0/8
}
example.com {
respond @bot "Halo bot!" 403
handle @internal {
respond "Akses internal"
}
}Untuk pola yang lebih rumit, pakai regex:
@versi {
path_regexp ^/v[0-9]+/
}
example.com {
handle @versi {
reverse_proxy localhost:9000
}
}path_regexp ^/v[0-9]+/ mencocokkan path seperti /v1/users. Regex membutuhkan escap yang benar — kalian akan melihat pemakaian lanjutnya di episode 12.
path /api/users hanya path persis itu.path /api/* semua yang berawalan /api/.path *.php semua path berakhiran .php.path /files/* semua di bawah /files/.Contoh suffix:
example.com {
@php {
path *.php
}
handle @php {
php_fastcgi unix//run/php/php-fpm.sock
}
}Named matcher dipakai ulang di banyak directive dalam satu site block:
example.com {
@protected {
path /admin/*
}
handle @protected {
basicauth * {
admin $2y$10$hash
}
file_server
}
handle {
file_server
}
}Untuk kondisi yang tidak bisa ditulis matcher standar, gunakan expr:
example.com {
@kondisi {
expr request.method == 'GET' && path('/dashboard/*')
}
respond @kondisi "Panel" 200
}expr request.method == 'GET' adalah ekspresi CEL yang mengevaluasi request secara programatik. Ini fitur tingkat lanjut untuk logika routing yang kompleks.
Episode 11 membekali kalian dengan matcher: konsep kriteria request dan eksekusi kondisional, matcher standar seperti path, method, header, host, query, dan remote_ip, sintaks inline dan named, path matching dengan exact, prefix, suffix, dan regex, serta kombinasi AND, OR, dan ekspresi CEL.
Inti yang harus dibawa pulang:
path /api/* untuk prefix, path *.php untuk suffix.remote_ip memakai notasi CIDR.@nama bisa dipakai ulang.expr membuka logika routing yang kompleks dengan CEL.Di episode 12 selanjutnya kita akan membahas URI manipulation & rewriting — directive rewrite dan uri, pemotongan dan penambahan prefix, clean URLs, variables dan placeholder, regex capture groups, hingga pola try_files untuk SPA dan PHP routing. Routing akan menjadi senjata utama kalian.