Làm thế nào để try_files hoạt động?


72

Tôi nhìn vào tài liệu nginx và nó vẫn làm tôi bối rối.

Làm thế nào để try_fileslàm việc? Đây là những gì tài liệu nói:

Từ NginxHttpCoreModule

thử_files

cú pháp: try_files path1 [path2] uri

mặc định: không có

bối cảnh: máy chủ, địa điểm

sẵn có: 0,7,27

Kiểm tra sự tồn tại của các tệp theo thứ tự và trả về tệp đầu tiên được tìm thấy. Dấu gạch chéo chỉ ra một thư mục - $ uri /. Trong trường hợp không tìm thấy tệp nào, một chuyển hướng nội bộ đến tham số cuối cùng được gọi. Tham số cuối cùng là URI dự phòng và phải tồn tại, nếu không sẽ xảy ra lỗi nội bộ. Không giống như viết lại, $ args không được bảo toàn tự động nếu dự phòng không phải là một vị trí được đặt tên. Nếu bạn cần bảo tồn args, bạn phải làm như vậy một cách rõ ràng:

Tôi không hiểu làm thế nào nó kiểm tra các đường dẫn và nếu tôi không muốn có lỗi nội bộ nhưng nó có tiếp tục phần còn lại của đường dẫn trong nỗ lực tìm tệp khác không?

Nếu tôi muốn thử một tập tin lưu trữ tại /path/app/cache/url/index.htmlvà nếu nó không thử /path/app/index.phplàm thế nào tôi sẽ viết nó? Nếu tôi viết:

try_files /path/app/cache/ $uri
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;

Tôi có index index.php index.html index.htm;. Khi tôi truy cập /urlname, nó sẽ thử kiểm tra /path/app/cache/urlname/index.phpsau đó /path/app/cache/urlname/index.html? Nếu chúng ta bỏ qua mọi thứ sau try_filesthì có thể try_fileskiểm tra thư mục bộ đệm không? Tôi đã cố gắng và đã thất bại.

Câu trả lời:


64

try_files thử đường dẫn bằng chữ mà bạn chỉ định liên quan đến chỉ thị gốc được xác định và đặt con trỏ tệp bên trong. Nếu bạn sử dụng ví dụ try_files /app/cache/ $uri @fallback;với index index.php index.html;nó thì nó sẽ kiểm tra các đường dẫn theo thứ tự này:

  1. $document_root/app/cache/index.php
  2. $document_root/app/cache/index.html
  3. $document_root$uri

trước khi cuối cùng chuyển hướng nội bộ đến vị trí được đặt tên @fallback. Bạn cũng có thể sử dụng tệp hoặc mã trạng thái ( =404) làm tham số cuối cùng của mình nhưng nếu sử dụng tệp thì phải tồn tại .

Bạn nên lưu ý rằng chính try_files sẽ không đưa ra chuyển hướng nội bộ cho bất cứ điều gì ngoại trừ tham số cuối cùng. Có nghĩa là bạn không thể thực hiện các thao tác sau: try_files $uri /cache.php @fallback;vì điều đó sẽ khiến nginx đặt con trỏ tệp nội bộ thành $ document_root / cache.php và phục vụ nó, nhưng vì không có chuyển hướng nội bộ nào diễn ra nên các vị trí không được đánh giá lại và như vậy nó sẽ được phục vụ như văn bản đơn giản. (Lý do nó hoạt động với các tệp PHP vì chỉ mục là chỉ thị chỉ mục sẽ đưa ra chuyển hướng nội bộ)


2
Đó là NHIỀU rõ ràng hơn. Cảm ơn. Tôi hơi không chắc vị trí được đặt tên hoạt động như thế nào. Nếu @fallback có các dòng cho php fastcgi sẽ phục vụ nó như một tệp php chứ không phải là văn bản? Là dự phòng được sử dụng khi tất cả mọi thứ trước khi nó thất bại?

2
Một vị trí được đặt tên chỉ giống nhau về mặt chức năng với một vị trí bình thường ngoại trừ nó chỉ có thể được truy cập thông qua các cơ chế nội bộ như error_page và try_files. Dự phòng trong try_files chỉ được sử dụng khi không có đường dẫn cụ thể nào dẫn đến một tệp hợp lệ. Bạn vẫn cần một vị trí để bắt \ .php $ URI vì nếu không thì try_files sẽ kích hoạt trên $ uri nếu tệp tồn tại và phục vụ dưới dạng văn bản thuần túy.
Martin Fjordvald

Cảm ơn bạn vì câu trả lời này .. Tôi vẫn còn một câu hỏi ở đây: Là try_files được thực thi ngay lập tức hay vị trí lồng nhau sẽ được thử trước đây?
Stphane

@Stphane Bạn đang di chuyển vào vùng nước âm u ở đây. Kế thừa trong nginx là phức tạp, lộn xộn và hoàn toàn không nhất quán. Tôi đã phải xem lại các ghi chú cũ của mình chỉ để ghi nhớ điều này để không có gì đảm bảo, nhưng dường như đối với try_files, cụ thể là khi chỉ xử lý các vị trí lồng nhau, sẽ không thực thi nếu vị trí bên trong khớp. Tuy nhiên, tôi khuyên bạn nên thử nghiệm nó.
Martin Fjordvald

5

Đây là một cách sử dụng tiện lợi khác của try_files, khi chuyển hướng vô điều kiện đến các vị trí được đặt tên. Các vị trí được đặt tên đang hoạt động hiệu quả như các chương trình con, tiết kiệm sao chép mã. Khi đối số đầu tiên cho try_files là "_", chuyển hướng dự phòng luôn được thực hiện.

    location =/wp-login.php { try_files _ @adminlock; }
    location ^~ /wp-admin/  { try_files _ @adminlock; }
    location @adminlock  {
            allow 544.23.310.198;
            deny all;
            try_files _ @backend;
            # wp-admin traffic is tiny so ok to send all reqs to backend 
    }
    location ~ \.php {  try_files _ @backend; }
    location / { try_files $uri $uri/ =403; }
    location @backend {
            fastcgi_pass 127.0.0.1:9000;
            include snippets/fastcgi-php.conf;
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.