Untuk memastikan bahwa kecocokan testdir dipilih sebagai ganti dari kecocokan jpg / txt, gunakan lokasi berikut:
location ^~ /testdir {
deny all;
return 404;
}
location ~* ^.+\.(jpg|txt)$ {
root /var/www/site;
}
Dalam contoh Anda, Anda memiliki dua jenis lokasi. location /testdir
adalah lokasi awalan, karena tidak memiliki tilde ( ~
) antara location
dan /testdir
.
location ~* ^.+\.(jpg|txt)$
adalah lokasi regex (yang case-insensitive, karena *
langsung setelah tilde). Dari dokumentasi nginx :
Untuk menemukan lokasi yang cocok dengan permintaan yang diberikan, nginx pertama-tama memeriksa lokasi yang ditentukan menggunakan string awalan (lokasi awalan). Di antara mereka, lokasi dengan awalan pencocokan terpanjang dipilih dan diingat. Kemudian ekspresi reguler diperiksa, sesuai urutan kemunculannya di file konfigurasi. Pencarian ekspresi reguler berakhir pada kecocokan pertama, dan konfigurasi yang sesuai digunakan. Jika tidak ditemukan kecocokan dengan ekspresi reguler maka konfigurasi lokasi awalan yang diingat sebelumnya digunakan.
Masalahnya di sini, adalah bahwa lokasi testdir Anda diingat, tetapi kemudian lokasi jpg / txt dipilih selama tahap regex, karena cocok. Catatan berikut dari dokumentasi adalah yang menjadi dasar solusi saya (diberikan di atas):
Jika lokasi awalan pencocokan terpanjang memiliki pengubah "^ ~" maka ekspresi reguler tidak dicentang.