Điểm:0

Tại sao nginx "return 301" và âtry_filesâ lại rơi vào vòng lặp vô tận

lá cờ dk

mã conf của tôi:

chỉ mục index.html index.php;
địa điểm / {
    nếu ($uri = '/a/') {
        trả về 301 https://example.com/a;
    }
    try_files $uri $uri/ =404; 
}

Nếu url là /một/, 301 đến /một, sau đó try_files một phần, thêm / đến /một kết thúc, trở thành /một/.

Bước tiếp theo, tôi nghĩ nó sẽ thử mục lục định nghĩa, trở thành /a/index.html, và tiếp cận tệp.

Nhưng thực ra, Nó đã cố gắng /một/, và nhảy ra khỏi địa điểm, sau đó đi vào địa điểm một lần nữa, để nếu ($uri = '/a/') { ... }.

Sau đó, một vòng lặp vô tận.

Tại sao, tôi chỉ bối rối thôi.


Những gì tôi muốn làm là

  1. Nếu yêu cầu ví dụ.com/a/, chuyển đến ví dụ.com/a, sau đó đến 2
  2. Nếu yêu cầu ví dụ.com/a, trình diễn example.com/a/index.html (nhưng url là ví dụ.com/a).

Bất cứ ai có thể giúp tôi đạt được điều này?

Điểm:2
lá cờ cz

Nó đang làm chính xác những gì nó phải làm.

Bạn không bao giờ có thể đạt được /a/index.html bởi vì bạn tiếp tục chuyển hướng trở lại /một trước khi điều này có thể xảy ra. Khi nginx xử lý việc này, nó sẽ thấy thư mục trên hệ thống tệp và tự động chuyển hướng (chính xác) đến /một/.

Bạn nên loại bỏ chuyển hướng không phù hợp này.

lá cờ dk
Ý của bạn là khi try`$uri/`, đầu tiên là `/a/` sau đó là `/a/indx.html`? (và `/a/` kích hoạt nhập lại `vị trí` trở lại `/a`.)
digijay avatar
lá cờ mx
Vâng, đó là những gì chuyển hướng 301 của bạn yêu cầu nginx của bạn làm
Michael Hampton avatar
lá cờ cz
@nanxiaobei Bạn không bao giờ phải thử_files vì ​​if được xử lý trước. Và **bạn không thể bỏ dấu gạch chéo ở cuối khi cung cấp nội dung tĩnh**. Nó là bắt buộc. Ngừng cố gắng.
lá cờ dk
@MichaelHampton Cảm ơn.Lỗi nginx được hiển thị là "vòng lặp vô hạn", vì vậy tôi nghĩ đầu tiên là `if`, sau đó là `$uri/`, sau đó quay lại `if` - giống như một vòng lặp. Khi `if` được xử lý, được đổi thành `/a`, do đó phải là `/a/` một lần nữa, nó sẽ trở lại thành `if`.
Điểm:0
lá cờ sv

Chào mừng đến với ServerFault. Bạn có thể làm những gì được đề cập trong OP với đoạn mã sau ...

địa điểm / {
    nếu ($uri = '/a/') {
        trả về 301 https://example.com/a;
    }
    try_files $uri $uri/index.html =404; 
}

Vui lòng xem câu hỏi liên quan và câu trả lời được chấp nhận tại Xóa dấu gạch chéo ở cuối URL bằng nginx .

Về cơ bản, chúng ta không cần phải dựa vào mục lục và thay vì phục vụ index.html trực tiếp khi ví dụ.com/a được yêu cầu.

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