Episode ini membahas redirect dan penanganan error: directive redir dengan status code 301, 302, dan lainnya, pola redirect www, custom error pages dengan handle_errors, serta directive respond untuk respons statis dan JSON.

Pengguna jarang mengetik URL yang persis benar. Mereka menulis www padahal situs non-www, membuka URL lama yang sudah pindah, atau menemukan halaman yang hilang. Episode 13 membahas dua alat untuk situasi ini: redirect untuk memindahkan pengguna, dan error handling untuk menghadapi request yang gagal.
redir memindahkan request ke lokasi lain. Pilihan status menentukan perilaku browser dan search engine:
example.com {
redir /old-page https://example.com/new-page permanent
redir /temp https://example.com/sementara temporary
}permanent menghasilkan 301 — untuk URL yang pindah selamanya; SEO mengalihkan authority.temporary menghasilkan 302 — untuk perubahan sementara, misalnya saat maintenance.307 dan 308 mempertahankan metode request.Untuk mempertahankan parameter query saat redirect, gunakan placeholder:
example.com {
redir /search /cari?{query} permanent
}redir /search /cari?{query} memindahkan pengguna dan membawa parameter query bersama. Pola ini mencegah data pencarian hilang saat pindah halaman.
Konsistensi domain penting untuk SEO dan cookie:
www.example.com {
redir https://example.com{uri} permanent
}
example.com {
root * /var/www
file_server
}Pola lain yang sering dipakai:
old.example.com {
redir https://example.com{uri} permanent
}Dan redirect banyak URL lama sekaligus:
example.com {
redir /lama1 /baru1 permanent
redir /lama2 /baru2 permanent
root * /var/www
file_server
}Halaman error default Caddy sederhana. Untuk pengalaman pengguna yang lebih baik, buat halaman kustom:
example.com {
handle_errors {
rewrite * /error-{http_error.code}.html
file_server
}
root * /var/www
file_server
}Kontrol lebih halus per status code:
example.com {
handle_errors {
@404 {
expression {http_error.status_code} == 404
}
handle @404 {
respond "Halaman tidak ditemukan" 404
}
handle {
respond "Terjadi kesalahan" 500
}
}
root * /var/www
file_server
}Jika kalian hanya ingin satu halaman untuk semua error:
example.com {
handle_errors {
respond "Ups, ada yang salah" {http_error.status_code}
}
root * /var/www
file_server
}respond bisa mengembalikan teks atau JSON:
example.com {
respond /halo "Halo, dunia!" 200
handle /api/status {
respond `{"status": "ok"}` 200 {
header Content-Type application/json
}
}
}respond dengan body JSON diapit backtick agar karakter kutip tidak bermasalah. Set header Content-Type agar klien mengenali JSON. Pola ini sering dipakai untuk health check endpoint.
Endpoint khusus untuk memantau ketersediaan:
example.com {
respond /healthz 200 "OK"
root * /var/www
file_server
}respond /healthz 200 "OK" memberi pemantau (uptime robot, load balancer) endpoint yang ringan untuk mengecek server. Health check akan dibahas lebih jauh di episode 16.
Episode 13 membekali redirect dan error handling: redir dengan status 301, 302, 307, dan 308, pola redirect www dan URL lama, halaman error kustom dengan handle_errors, penanganan status spesifik dan catch-all, serta respond untuk respons statis, JSON, dan health check.
Inti yang harus dibawa pulang:
redir ... permanent memakai 301, temporary memakai 302.{uri} dan {query} agar redirect tidak kehilangan data.handle_errors menangani semua halaman error kustom.{http_error.status_code} memberi tahu status error aktif.respond bisa mengembalikan teks, JSON, dan health check.redir sebelum handler lain agar diproses lebih dulu.Di episode 14 selanjutnya kita masuk ke load balancing strategies — multiple backend dengan policy round_robin, least_conn, ip_hash, dan lainnya, health checks aktif dan pasif, konfigurasi upstream dengan weight dan timeout, serta use case scaling horizontal dan high availability.