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.txt
trong đường dẫn URL bằng /home/www/static/robots.txt
và 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.txt
vì /robots.txt
tước /robots.txt
tiền tố là chuỗi rỗng và nối thêm chuỗi trống để giữ cho chuỗi /home/www/static/robots.txt
không thay đổi. Nhưng, /robots.txt1
sẽ được phục vụ từ /home/www/static/robots.txt1
và /robots.txt/foobar
sẽ đượ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.txt
khô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_files
này thay đổi hành vi của root
/ alias
và có những ràng buộc về nơi alias
có 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. :)