Episode ini membedah lima tipe sintaks location di NGINX dan aturan prioritas pemilihan location, sehingga kalian tahu persis mengapa sebuah URI dicocokkan ke block yang mana.

Location block adalah otak routing NGINX. Setiap request yang masuk harus dicocokkan ke lokasi yang paling tepat, dan NGINX punya aturan prioritas yang sangat spesifik. Episode 4 ini membedah lima tipe sintaks location dan urutan evaluasinya.
Banyak bug konfigurasi berawal dari salah memahami location: konfigurasi untuk .php yang tidak pernah dieksekusi, static asset yang tertangkap block salah, atau regex yang tidak pernah dipakai. Setelah episode ini, kalian akan memahami mengapa hal itu terjadi dan bagaimana mencegahnya.
Modifier = membuat pencocokan persis. Ini yang paling cepat dan berprioritas tertinggi:
location = /favicon.ico {
log_not_found off;
}location = /favicon.ico hanya cocok untuk URI /favicon.ico, bukan /favicon.ico/ atau /favicon.ico.png. Gunakan exact match untuk URI yang harus ditangani sangat cepat seperti favicon dan halaman 404.
Modifier ^~ menandai prefix match yang diprioritaskan: jika URI cocok dengan prefix ini, NGINX berhenti mencari dan tidak memeriksa regex:
location ^~ /assets/ {
root /var/www/site;
expires 30d;
}Modifier ~ mencocokkan pola regex secara case-sensitive, sedangkan ~* secara case-insensitive:
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
expires 30d;
add_header Cache-Control "public";
}location ~ \.php$ menangkap file PHP, dan location ~* menangkap static asset dengan ekstensi apa pun tanpa peduli huruf besar atau kecil.
Tanpa modifier, ini pencocokan prefix biasa. NGINX akan mengingat prefix terpanjang yang cocok:
location /docs/ {
root /var/www;
}Ketika request masuk, NGINX mengevaluasi lokasi dengan urutan berikut:
= — jika cocok, langsung dipakai.^~ — jika cocok dan paling panjang, dipakai dan pencarian berhenti.~ dan ~*) — dievaluasi dalam urutan penulisan; regex pertama yang cocok langsung dipakai.Kunci yang sering dilupakan: regex menang atas standard prefix, tapi kalah dari exact match dan preferential prefix match. Mari lihat contoh konkret.
Pertimbangkan konfigurasi berikut dengan request GET /assets/img/logo.png:
server {
listen 80;
server_name example.com;
location /assets/ {
root /var/www/site;
}
location ~* \.(png|jpg|css|js)$ {
expires 30d;
}
}Request /assets/img/logo.png cocok dengan standard prefix /assets/, dan juga cocok dengan regex ~* \.(png|jpg|css|js)$. Karena regex dievaluasi setelah prefix, NGINX memilih regex, sehingga header expires 30d berlaku. Jika kalian ingin static asset dilayani tanpa regex, tambahkan ^~:
location ^~ /assets/ {
root /var/www/site;
expires 30d;
}Sekarang ^~ menang karena lebih tinggi prioritasnya dari regex. Inilah cara NGINX memutuskan block mana yang dipakai.
location / cocok dengan semua URI, jadi selalu dipakai sebagai fallback terakhir.error_page tujuan yang salah jika mengarah ke URI yang cocok dengan location lain.Untuk melihat konfigurasi lengkap yang akan diterapkan NGINX, jalankan:
sudo nginx -T | lessnginx -T menggabungkan semua file konfigurasi setelah proses include. Kalian bisa melihat apakah location yang ditulis benar-benar berada di server block yang diharapkan.
Periksa access log untuk melihat status setiap request dan pastikan routing sesuai harapan:
sudo tail -f /var/log/nginx/access.logKombinasi nginx -T dan access log cukup untuk membongkar hampir semua misteri routing location.
Episode 4 membekali kalian logika routing NGINX: lima tipe location dengan modifier yang berbeda, urutan prioritas dari exact match sampai standard prefix, dan cara regex menang atas standard prefix kecuali saat ^~ ikut bermain.
Inti yang harus dibawa pulang:
location = /path untuk exact match paling cepat.location ^~ /path/ memprioritaskan prefix dan menghentikan pencarian regex.~ regex case-sensitive, ~* regex case-insensitive, keduanya first match.= lalu ^~ lalu regex lalu prefix terpanjang.nginx -T dan access log adalah alat debugging routing terbaik.Di episode 5 selanjutnya kita akan membahas rewrite rules, redirects, dan URL manipulation — perbedaan return dan rewrite, status 301 versus 302, flag pada rewrite, sampai pola try_files untuk routing aplikasi single page. Bersiap, karena di sinilah URL mulai "berkelahi" dengan NGINX.