Điểm:0

Nginx try_files không thành công trên tham số đầu tiên và trả về 404

lá cờ jp

Chịu đựng với tôi, đây là một cái dài.

Ban đầu, tôi đã tạo một máy chủ Nginx để lưu trữ các tệp tĩnh cho công ty của mình và nó hoạt động rất tốt với đoạn mã cấu hình sau để phục vụ các tệp:

người phục vụ {
  # bó thứ ssl
  gốc/đường dẫn/đến/tệp;

  địa điểm / {
    bao gồm cors_support;
    gửi tệp trên;
    sendfile_max_chunk 1m;

    try_files $uri =404;
  }

Đơn giản, sạch sẽ và chức năng. Cho đến khi tôi nghĩ rằng tôi sẽ thêm một chức năng khác vào máy chủ này: lưu trữ các bản dựng ứng dụng của chúng tôi và cung cấp chúng cho nhóm QA của chúng tôi. Vì các tệp ứng dụng có thể khá lớn nên tôi đã thêm một dung lượng lưu trữ khác chỉ dành cho các bản dựng và nghĩ rằng tôi có thể giải quyết vấn đề này bằng một thay đổi đơn giản đối với cấu hình Nginx như sau (chỉ hiển thị các phần có liên quan):

người phục vụ {
  # gần như giống nhau
  gốc/mới/đường dẫn/đến/xây dựng;

  địa điểm / {
    #giống như trước
    try_files $uri @cdn_files;
  }

  vị trí @cdn_files {
    #some cors và cài đặt send_file
    gốc/đường dẫn/đến/tệp;
    try_files $uri =404;
  }
}

Những gì tôi mong đợi sẽ xảy ra theo tài liệu:

  • yêu cầu đến cho một tập tin
  • kiểm tra khối đầu tiên cho tập tin
  • tập tin được tìm thấy? yes=gửi tập tin no=chuyển hướng đến vị trí được đặt tên
  • vị trí được đặt tên -> tệp được tìm thấy? yes=gửi tập tin no=trang 404

Điều gì thực sự xảy ra:

  • yêu cầu đến cho một tập tin
  • kiểm tra khối đầu tiên cho tập tin
  • tập tin được tìm thấy? yes=gửi tập tin no=trang 404

Tôi đã thử một số nỗ lực khác nhau để sửa lỗi này, bao gồm cả một số nỗ lực "kính mừng mary" điên rồ.

Điều này tạo ra kết quả tương tự (trang 404):

# ... mã không liên quan
nguồn gốc /;
địa điểm / {
  # ... thêm mã không liên quan
  try_files /new/path/to/builds/$uri /path/to/files/$uri =404;
}

Điều này tạo ra kết quả tương tự (trang 404):

#...
gốc/mới/đường dẫn/đến/xây dựng;

địa điểm / {
  #...
  try_files $uri @cdn_files;
}

vị trí @cdn_files {
  #...
  gốc/đường dẫn/đến/tệp;
  try_files $uri =403; #lưu ý rằng trang được phân phối là 404 chứ KHÔNG phải 403
}

Điều này cũng tạo ra 404:

# Tôi đã xóa lệnh "root" khỏi khối máy chủ cho thử nghiệm này

địa điểm / {
  #...
  gốc/mới/đường dẫn/đến/xây dựng;
  try_files $uri ../realitve/path/to/files/$uri =404;
}

Một vài điều khác cần lưu ý:

  • Nhật ký lỗi chỉ hiển thị 1 lần thử định vị tệp ở tham số đầu tiên của try_files chỉ thị.
  • Nếu tệp tồn tại trong tham số đầu tiên của try_files chỉ thị tập tin được gửi
  • Tôi không nghĩ nó tương đối nhưng đề phòng: HĐH là Ubuntu 16.04

Chỉnh sửa:

  • Nginx phiên bản 1.21.0
Ivan Shatsky avatar
lá cờ gr
Tôi cho rằng bạn hiểu rằng tệp sẽ được tìm kiếm tại `root` + `uri`, nghĩa là URI yêu cầu `/uploads/myfile` sẽ được tìm kiếm dưới dạng `/new/path/to/builds/uploads/myfile` trước tiên và `/path/to/files/uploads/myfile` giây. Bên cạnh đó, không có lỗi trong cấu hình của bạn. Lý do duy nhất tôi có thể đoán là yêu cầu của bạn thực sự được xử lý bởi một số vị trí khác ngoài vị trí `location / { ... }`. Tuy nhiên, để đảm bảo toàn bộ cấu hình cần thiết, cũng như URI yêu cầu thực tế.
Điểm:0
lá cờ jp

Vì vậy, cuối cùng tôi đã quản lý để làm việc này bằng cách định tuyến các yêu cầu đến của tôi đối với các bản dựng thông qua một URL mới và do đó vào khối máy chủ của riêng chúng, để lại quyền truy cập tệp gốc như trước khi sửa đổi và cả hai URL hiện hoạt động để truy xuất các tệp từ cụ thể của chúng địa điểm.

Tôi đã tìm kiếm và googled và mân mê trong vài giờ nhưng tôi không bao giờ có thể khắc phục việc truy cập các tệp từ nhiều thư mục trong một khối máy chủ, mặc dù nếu xem tài liệu thì điều đó có thể thực hiện được.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.