Nginx - root so với bí danh, để phục vụ các tệp đơn?


66

Sau nhiều giờ nginxđể phục vụ các tệp đơn lẻ như robots.txt(gợi ý: xóa bộ nhớ cache của trình duyệt mỗi lần), tôi xử lý hai cách khác nhau, một cách sử dụng chỉ thị bí danh và một bằng cách sử dụng chỉ thị gốc , như vậy:

location /robots.txt { alias /home/www/static/robots.txt; }
location /robots.txt { root /home/www/static/;  }

Có sự khác biệt về chức năng giữa hai? Hay vấn đề bảo mật? Bất kỳ xung đột với các chỉ thị khác? (Cả hai dường như tốt với vị trí khác / tĩnh). Hoặc bất kỳ lý do để chọn một trong những khác?

Lưu ý - Tôi đã không sử dụng cả hai cùng một lúc :) Thay vào đó tôi đã thử từng cái một, và cả hai đều hoạt động. Tôi không hỏi làm thế nào cả hai tương tác với nhau trong cùng một tệp, nhưng cái nào sẽ tốt hơn để sử dụng.

Câu trả lời:


71

Chà, hai chỉ thị này hơi khác nhau về chức năng vì bạn không sử dụng khớp chính xác trong trường hợp sau. Vì vậy, /robots.txt1111sẽ phù hợp với vị trí thứ hai của bạn quá.
location =/robots.txt { root /home/www/static/; }là một chức năng chính xác tương đương với chỉ thị đầu tiên của bạn.


Điểm tốt, cảm ơn. Nhưng bạn có thể sử dụng một =trong cả hai trường hợp, đúng không? Hay nó chỉ áp dụng cho root? 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. :)
Cyclops

@Cyclops có, bạn có thể sử dụng =trong cả hai trường hợp.
Alexander Azarov

Vì vậy, chúng sẽ giống nhau - có lý do nào để chọn một chỉ thị khác không? Là câu hỏi chính của tôi.
Cyclops

@Cyclops Về cơ bản, không có lý do như vậy.
Alex

41

Có, có một sự khác biệt: Với "bí danh", bạn có thể .. cũng bí danh cho một tên tệp khác, như

location /robots.txt { alias /home/www/static/any-filename.txt; }

trong khi

location /robots.txt { root /home/www/static/; }

buộc bạn phải đặt tên cho tệp của mình trên máy chủ cũng là tệp robots.txt. Tôi sử dụng tùy chọn đầu tiên vì tôi muốn đặt tên cho các tệp robot của mình trên máy chủ của mình là tld.domain.subdomain-robot.txt; ví dụ

location /robots.txt { alias /home/www/static/ch.notex.static-robots.txt; }

1

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.txt/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.txt1/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.


0

Có một sự khác biệt, khi bí danh là cho toàn bộ thư mục.

    location ^~ /data/ { alias /home/www/static/data/; }

sẽ làm việc, trong khi

    location ^~ /data/ { root /home/www/static/data/; }

sẽ không làm. Điều này sẽ phải

    location ^~ /data/ { root /home/www/static/; }

(Dễ nhầm lẫn)

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.