Điểm:1

Nginx try_files không hoạt động bên trong khối máy chủ

lá cờ ar
http {
bao gồm mime.types;
ứng dụng default_type/octet-stream;

người phục vụ {
    gốc / trang web;
    nghe 80;
    máy chủ_tên máy chủ cục bộ;

    # không làm việc
    try_files /logo.png /logo.jpg /error;

    # làm
    viết lại ^/e /lỗi;

    # làm
    # return 200 "$request_uri Được khối máy chủ xử lý";

    địa điểm / {
        default_type văn bản/đơn giản;
        trả về 200 "Tiền tố gốc phù hợp";
    }

    vị trí/lỗi {
        default_type văn bản/đơn giản;
        return 404 "Không tìm thấy logo";
    }
}

Tôi muốn biết nguyên nhân của đánh giá này là gì, tôi không thể tìm thấy bất kỳ lời giải thích đáng tin cậy nào trên tài liệu cũng như trên diễn đàn.

Nhân tiện, tôi đã thử nghiệm tình huống sau:

  • Đã xóa vị trí/khối {} và nó hoạt động như dự định. tôi biết điều đó khi yêu cầu được gửi tới máy chủ, nó sẽ được máy chủ đánh giá lần đầu tiên khối và sau đó khối vị trí phù hợp. Nhưng có vẻ như try_files chỉ thị bị bỏ qua (TẠI SAO?!!). Nếu tôi đúng đối số cuối cùng của try_files lệnh viết lại URI để nó hoạt động như viết lại chỉ thị. Cả lệnh viết lại và trả về đều hoạt động như dự định, họ đánh giá mọi lúc bất kể có vị trí hay không chặn trận đấu hay không.

Tôi đã nghiên cứu rất nhiều để tìm thông tin đáng tin cậy giải thích tình trạng này, nhưng tôi không thể tìm thấy. Vì vậy, tôi đang hỏi ở đây để biết câu trả lời hoặc nguồn về nội bộ Nginx mà ai đó biết.

Richard Smith avatar
lá cờ jp
Giả định của bạn rằng "nó được đánh giá lần đầu bởi khối máy chủ" là không chính xác.
Safar Safarli avatar
lá cờ ar
@RichardSmith. Cảm ơn đã quan tâm. Bạn có thể vui lòng giải thích tại sao?
Ivan Shatsky avatar
lá cờ gr
@SafarSafarli Bên cạnh những gì Richard Smith đã nói, bạn nên biết rằng có các giai đoạn xử lý yêu cầu khác nhau. Kiểm tra [tài liệu phát triển nginx](http://nginx.org/en/docs/dev/development_guide.html#http_phases) hoặc [bài viết này](http://www.nginxguts.com/phases/) để biết thêm thông tin. Chỉ thị từ `ngx_http_rewrite_module` được đặt ở cấp máy chủ được xử lý trong `NGX_HTTP_SERVER_REWRITE_PHASE` trong khi chỉ thị `try_files` được xử lý trong `NGX_HTTP_PRECONTENT_PHASE`.
Safar Safarli avatar
lá cờ ar
@IvanShatsky, Cảm ơn bạn đã quan tâm.
Safar Safarli avatar
lá cờ ar
@IvanShatsky Tôi đã đọc phần của bài viết bạn đã cung cấp.Nhưng tôi thấy hơi khó hiểu, ví dụ: " `ngx_http_try_files_module` và `ngx_http_mirror_module` đăng ký trình xử lý của chúng ở giai đoạn này..". Gọi `ngx_http_try_files_module` là một mô-đun khó hiểu, không nên sử dụng từ "chỉ thị" thay thế?
Ivan Shatsky avatar
lá cờ gr
@SafarSafarli Lệnh `try_files` thực sự nằm trong [`ngx_http_try_files_module`](https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_try_files_module.c) của chính nó chứ không phải [`ngx_http_core_module` ](https://github.com/nginx/nginx/blob/master/src/http/ngx_http_core_module.c) (xem các liên kết GitHub được cung cấp tới mã nguồn nginx).
Safar Safarli avatar
lá cờ ar
@IvanShatsky, vậy tại sao nó lại được đặt làm chỉ thị của mô-đun lõi?https://nginx.org/en/docs/http/ngx_http_core_module.html. nó thật khó hiểu
Ivan Shatsky avatar
lá cờ gr
@SafarSafarli Tôi đã tìm thấy câu trả lời cho câu hỏi của bạn. Nó _là_ lệnh của mô-đun lõi cho đến khi thiết kế lại xảy ra vào năm 2017. Cho đến khi lệnh `try_files` đó sử dụng lệnh `TRY_FILES_PHASE` đặc biệt chỉ dành riêng cho `try_files` và không có lệnh nào khác. Với thiết kế lại, `PRECONTENT_PHASE` mới đã được thêm vào quy trình xử lý yêu cầu nginx và việc triển khai chỉ thị `try_files` đã được chuyển sang một mô-đun riêng biệt bằng cách sử dụng giai đoạn đó. Giờ đây, bất kỳ mô-đun bên thứ ba nào cũng có thể sử dụng `PRECONTENT_PHASE` mới này cùng với `nginx_http_try_files_module`.
Ivan Shatsky avatar
lá cờ gr
@SafarSafarli Vì vậy, tôi nghĩ rằng nhóm nginx đã quyết định không viết lại tài liệu. Có một chút khác biệt từ quan điểm của người dùng cuối. Tương tự như vậy, bạn không thể vô hiệu hóa cả `nginx_http_core_module` hay `nginx_http_try_files_module` khi bạn xây dựng nginx từ các nguồn. Bạn có thể xem cam kết thiết kế lại nói trên đối với nguồn nginx [tại đây](https://github.com/nginx/nginx/commit/129b06dc5dfab7b4513a4f274b3778cd9b8a6a22).
Điểm:0
lá cờ jp

Nhìn thấy cách nginx xử lý một yêu cầu. Nhưng tôi sẽ thêm một vài cảnh báo giải quyết cụ thể câu hỏi của bạn và dễ dàng quan sát nhưng có thể không được ghi chép đầy đủ.

Bạn đề cập đến viết lạitrở lại chỉ thị, nhưng chúng thuộc về ngx_http_rewrite_module có các quy tắc đánh giá riêng và không hoạt động giống như các chỉ thị cốt lõi. bạn nói đúng đó viết lạitrở lại Trong người phục vụ ngữ cảnh có thể thực thi trước khi địa điểm khối được chọn.

Như bạn đã quan sát (ngoại trừ ngx_http_rewrite_module), các người phục vụ bối cảnh hoạt động như mặc định địa điểm, nghĩa là, nếu không có gì khác địa điểm khối phù hợp với yêu cầu. Sự hiện diện rõ ràng địa điểm / { ... } khối sẽ luôn được ưu tiên.

Safar Safarli avatar
lá cờ ar
Tôi hiểu rồi, nhưng câu hỏi của tôi chủ yếu là về chỉ thị "try_files". Bạn có thể vui lòng cung cấp thêm thông tin về nó. Trong trường hợp này trong bối cảnh máy chủ. Cảm ơn
Richard Smith avatar
lá cờ jp
Tôi không có thêm bất kỳ thông tin nào, như tôi đã nói đây là hành vi được quan sát.

Đă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.