try_files adalah salah satu directive Nginx yang paling sering digunakan, namun juga paling sering disalahpahami. Banyak konfigurasi yang tampak “berfungsi”, tetapi sebenarnya keliru, tidak efisien, atau menimbulkan bug tersembunyi—terutama pada aplikasi PHP, framework modern, dan SPA.
Artikel ini membahas apa itu try_files, bagaimana cara kerjanya, serta kesalahan-kesalahan umum (salah kaprah) yang sering terjadi lengkap dengan contoh dan solusi yang benar.
Contents
- 1 1. Apa Itu try_files?
- 2 2. Cara Kerja try_files (Penting untuk Dipahami)
- 3 3. Salah Kaprah #1: Mengira try_files Itu Redirect
- 4 4. Salah Kaprah #2: Lupa $query_string
- 5 5. Salah Kaprah #3: Menggunakan try_files di location ~ \.php$
- 6 6. Salah Kaprah #4: Salah Urutan Argumen try_files
- 7 7. Salah Kaprah #5: Mengira try_files Bisa Mengecek URL Eksternal
- 8 8. Contoh Konfigurasi Ideal (PHP / Laravel / CI / Symfony)
- 9 9. Tips Debugging try_files
- 10 10. Kesimpulan
- 11 Related Posts
1. Apa Itu try_files?
try_files adalah directive Nginx untuk mencoba beberapa path file atau URI secara berurutan. Jika satu path tidak ditemukan, Nginx akan mencoba path berikutnya, sampai salah satu berhasil atau berakhir pada fallback (biasanya 404 atau internal redirect).
Contoh sederhana:
location / {
try_files $uri $uri/ =404;
}
Artinya:
- Coba file sesuai URI (misalnya
/img/logo.png) - Jika tidak ada, coba sebagai direktori (
/img/logo.png/) - Jika tetap tidak ada, kembalikan
404
2. Cara Kerja try_files (Penting untuk Dipahami)
Hal yang sering dilupakan:
try_filestidak melakukan redirect HTTP (301/302)- Ia melakukan internal check di filesystem
- Dieksekusi sebelum request diteruskan ke FastCGI / proxy
Secara mental model:
“Nginx mengecek file di disk, bukan menanyakan ke aplikasi.”
Jika tidak memahami ini, hampir pasti konfigurasi try_files akan keliru.
3. Salah Kaprah #1: Mengira try_files Itu Redirect
❌ Konfigurasi Salah
try_files $uri /index.php;
Banyak yang mengira:
“Jika file tidak ada, redirect ke
/index.php“
Padahal:
- Tidak ada redirect
- URL di browser tetap sama
- Yang berubah hanya handler internal
✅ Pemahaman yang Benar
/index.php di sini adalah internal fallback, bukan redirect HTTP.
Jika ingin redirect:
return 302 /index.php;
4. Salah Kaprah #2: Lupa $query_string
❌ Kesalahan Umum (Framework PHP)
try_files $uri /index.php;
Masalah:
- Query string (
?id=123) hilang - Routing framework bisa rusak
✅ Konfigurasi yang Benar
try_files $uri $uri/ /index.php?$query_string;
Atau yang lebih aman:
try_files $uri $uri/ /index.php$is_args$args;
Penjelasan:
$is_args→ menambahkan?jika ada query$args→ query string
5. Salah Kaprah #3: Menggunakan try_files di location ~ \.php$
❌ Contoh Salah
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass php:9000;
}
Masalah:
try_filesdi sini tidak berguna- PHP seharusnya hanya dieksekusi jika file memang ada
✅ Pola yang Benar
Pisahkan tanggung jawab:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass php:9000;
}
6. Salah Kaprah #4: Salah Urutan Argumen try_files
❌ Urutan yang Salah
try_files /index.php $uri $uri/;
Dampak:
- Semua request selalu masuk ke
index.php - File statis tidak pernah dilayani langsung
- Performa menurun
✅ Urutan yang Tepat
try_files $uri $uri/ /index.php?$query_string;
Prinsip:
File statis → Direktori → Aplikasi
7. Salah Kaprah #5: Mengira try_files Bisa Mengecek URL Eksternal
❌ Asumsi Salah
try_files $uri http://backend;
Fakta:
try_fileshanya bekerja dengan filesystem lokal- Tidak bisa mengecek upstream, API, atau URL eksternal
✅ Solusi yang Tepat
Gunakan:
proxy_passerror_page+ internal redirectrewritejika memang perlu
8. Contoh Konfigurasi Ideal (PHP / Laravel / CI / Symfony)
server {
listen 80;
server_name example.com;
root /var/www/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass php:9000;
}
}
Keuntungan:
- File statis cepat
- Routing framework bersih
- Query string aman
- Mudah di-debug
9. Tips Debugging try_files
- Aktifkan
error_logleveldebug - Cek path
rootvsalias - Pastikan permission filesystem benar
- Ingat: Nginx tidak melihat routing aplikasi
10. Kesimpulan
try_files bukan sekadar baris konfigurasi, tetapi fondasi alur request di Nginx. Kesalahpahaman kecil dapat menyebabkan:
- Routing rusak
- Query hilang
- Performa menurun
- Bug yang sulit dilacak
Jika mengingat satu hal saja:
try_filesmengecek file di disk, bukan logika aplikasi.
Memahami prinsip ini akan membuat konfigurasi Nginx Anda jauh lebih stabil, aman, dan efisien.
Semoga artikel ini membantu meluruskan salah kaprah yang sering terjadi saat menggunakan try_files di Nginx.