Tôi nghĩ rằng đáng để đặt ra rằng nginx đang hoạt động trên các tiền tố chứ không phải các tệp mỗi se. Trong trường hợp đầu tiên,
location /robots.txt { alias /home/www/static/robots.txt; }
nginx thay thế tiền tố chuỗi /robots.txttrong đường dẫn URL bằng /home/www/static/robots.txtvà sau đó sử dụng kết quả làm đường dẫn hệ thống tệp. Đại diện là mã giả, đây sẽ là một cái gì đó như:
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/robots.txt" + urlPath.stripPrefix("/robots.txt")
serveFile(fsPath)
}
Vì vậy, /robots.txtđược phục vụ từ /home/www/static/robots.txtvì /robots.txttước /robots.txttiền tố là chuỗi rỗng và nối thêm chuỗi trống để giữ cho chuỗi /home/www/static/robots.txtkhông thay đổi. Nhưng, /robots.txt1sẽ được phục vụ từ /home/www/static/robots.txt1và /robots.txt/foobarsẽ được phục vụ từ /home/www/static/robots.txt/foobar. Những tập tin có thể không tồn tại, gây nginx để gửi một phản ứng 404, và nó có khả năng robots.txtkhông phải là một thư mục nào, nhưng nginx không biết rằng trước, và điều này là tất cả dựa trên tiền tố chuỗi và không phải những gì xuất hiện là một tập tin hoặc thư mục bởi sự vắng mặt hoặc sự hiện diện của dấu gạch chéo.
Trong khi đó, trong trường hợp thứ hai,
location /robots.txt { root /home/www/static/; }
nginx chèn chuỗi /home/www/static/ở đầu đường dẫn URL và sau đó sử dụng kết quả làm đường dẫn hệ thống tệp. Trong mã giả, đây sẽ là một cái gì đó như:
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/" + urlPath
serveFile(fsPath)
}
Điều này có kết quả chính xác như trường hợp đầu tiên, nhưng vì một lý do khác. Không có tiền tố tước, nhưng vì mỗi con đường URI có chứa tiền tố /robots.txt, sau đó các đường dẫn hệ thống tập tin sẽ luôn luôn bắt đầu với /home/www/static//robots.txtđó là tương đương với /home/www/static/robots.txt .
Tất nhiên, mã giả không hoàn toàn nói lên toàn bộ câu chuyện, ví dụ như nginx sẽ không sử dụng một cách mù quáng các đường dẫn URL thô như /../../../etc/passwd, lệnh try_filesnày thay đổi hành vi của root/ aliasvà có những ràng buộc về nơi aliascó thể được sử dụng.
=trong cả hai trường hợp, đúng không? Hay nó chỉ áp dụng choroot? Ngoài ra, hãy xem chỉnh sửa của tôi - Tôi không có ý sử dụng cả hai cùng một lúc. :)