try_files Nginx yang Sering Salah Kaprah

try_files Nginx yang Sering Salah Kaprah

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.


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:

  1. Coba file sesuai URI (misalnya /img/logo.png)
  2. Jika tidak ada, coba sebagai direktori (/img/logo.png/)
  3. Jika tetap tidak ada, kembalikan 404

2. Cara Kerja try_files (Penting untuk Dipahami)

Hal yang sering dilupakan:

  • try_files tidak 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_files di 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_files hanya bekerja dengan filesystem lokal
  • Tidak bisa mengecek upstream, API, atau URL eksternal

✅ Solusi yang Tepat

Gunakan:

  • proxy_pass
  • error_page + internal redirect
  • rewrite jika 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_log level debug
  • Cek path root vs alias
  • 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_files mengecek 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.