Để đảm bảo rằng kết quả khớp testdir được chọn thay vì khớp jpg / txt, hãy sử dụng các vị trí sau:
location ^~ /testdir {
deny all;
return 404;
}
location ~* ^.+\.(jpg|txt)$ {
root /var/www/site;
}
Trong ví dụ của bạn, bạn có hai loại vị trí. location /testdir
là một vị trí tiền tố, vì nó không có dấu ngã ( ~
) giữa location
và /testdir
.
location ~* ^.+\.(jpg|txt)$
là một vị trí regex (một trường hợp không nhạy cảm, do *
trực tiếp sau dấu ngã). Từ tài liệu nginx :
Để tìm vị trí khớp với một yêu cầu đã cho, trước tiên nginx kiểm tra các vị trí được xác định bằng chuỗi tiền tố (vị trí tiền tố). Trong số đó, vị trí có tiền tố phù hợp dài nhất được chọn và ghi nhớ. Sau đó, các biểu thức chính quy được kiểm tra, theo thứ tự xuất hiện của chúng trong tệp cấu hình. Việc tìm kiếm các biểu thức chính quy chấm dứt trên kết quả khớp đầu tiên và cấu hình tương ứng được sử dụng. Nếu không tìm thấy kết quả khớp với biểu thức chính quy thì cấu hình của vị trí tiền tố được nhớ trước đó sẽ được sử dụng.
Vấn đề ở đây là vị trí testdir của bạn đang được ghi nhớ, nhưng sau đó vị trí jpg / txt được chọn trong giai đoạn regex, vì nó phù hợp. Lưu ý sau đây từ tài liệu này là những gì tôi dựa trên giải pháp của mình (được nêu ở trên) dựa trên:
Nếu vị trí tiền tố phù hợp dài nhất có bộ sửa đổi ^ ^ ~ thì các biểu thức thông thường không được kiểm tra.