Tôi hơi bối rối. Nhiều ví dụ cho thấy việc sử dụng cả hai:http.ServeFile(..)
Và http.FileServer(..)
, nhưng có vẻ như chúng có chức năng rất gần nhau. Tôi cũng không tìm thấy thông tin nào về cách thiết lập trình xử lý NotFound tùy chỉnh.
// Thao tác này sẽ xóa đoạn "/static/" khỏi đường dẫn
fs := http.FileServer(http.Dir("static"))
http. Xử lý("/tĩnh/", http. StripPrefix("/tĩnh/", fs))
// Cách này cũng hiệu quả, nhưng đoạn "/static2/" vẫn còn và cần phải được phân chia thủ công
http.HandleFunc("/static2/", hàm(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, r.URL.Path[1:])
})
http.ListenAndServe(":8080", không có)
Tôi đã thử đọc mã nguồn và tất cả đều sử dụng serveFile(ResponseWriter, *Request, FileSystem, chuỗi, bool)
Chức năng cấp thấp. Tuy nhiên http.FileServer
返回 trình xử lý tập tin
và đi kèm với cái riêng của nó Phục vụHTTP()
phương thức và thực hiện một số công việc chuẩn bị (chẳng hạn như path.Clean()) trước khi phân phát tệp.
Vậy tại sao cần có sự tách biệt này? Phương pháp nào hoạt động tốt hơn? Và làm cách nào để đặt trình xử lý NotFound tùy chỉnh, ví dụ như khi không tìm thấy tệp được yêu cầu?
Sự khác biệt chính là http.FileServer
Cung cấp hiệu quả ánh xạ gần như 1: 1 của tiền tố HTTP tới hệ thống tệp. Bằng tiếng Anh đơn giản, nó cung cấp một đường dẫn thư mục đầy đủ. và tất cả con cái của nó.
Giả sử bạn có một tập tin có tên /trang chủ/bob/tĩnh
thư mục và bạn có các cài đặt sau:
fs := http.FileServer(http.Dir("/home/bob/static"))
http. Xử lý("/tĩnh/", http. StripPrefix("/tĩnh", fs))
Máy chủ của bạn sẽ chấp nhận yêu cầu như/tĩnh/foo/thanh
và cung cấp /home/bob/static/foo/bar
(hoặc bất cứ điều gì trong 404)
Ngược lại,Phục vụ tập tin
là một trình trợ giúp cấp thấp hơn có thể được sử dụng để triển khai một cái gì đó tương tự như FileServer hoặc triển khai các sửa đổi đường dẫn của riêng bạn và bất kỳ thứ gì. Nó chỉ lấy tệp cục bộ được đặt tên và gửi nó qua kết nối HTTP. Bản thân nó sẽ không cung cấp toàn bộ tiền tố thư mục (trừ khi bạn viết một trình xử lý để thực hiện một số tra cứu tương tự như FileServer)
Để ýPhục vụ một hệ thống tệp một cách ngây thơ là một việc có thể nguy hiểm (có nhiều cách tiềm ẩn để phá vỡ cây gốc), vì vậy tôi khuyên bạn nên làm điều đó trừ khi bạn真的Biết bạn đang làm gì, hãy sử dụng http.FileServer
Và http.Dir
Bởi vì chúng chứa các kiểm tra để đảm bảo rằng người ta không thể thoát ra khỏi FS, điều này Phục vụ tập tin
KHÔNG.
phụ lụcThật không may, câu hỏi thứ hai của bạn, làm cách nào để tạo trình xử lý NotFound tùy chỉnh, không dễ trả lời. Bởi vì như bạn đã nhận thấy, đây là từ hàm bên trong phục vụTệp
được gọi nên không có nơi nào siêu nhân có thể dễ dàng vào được. Có thể có một số điều lén lút như sử dụng của riêng bạn Người phản hồi
Chặn phản hồi, nó sẽ chặn mã phản hồi 404, nhưng tôi sẽ giao việc đó cho bạn.
Tôi là một lập trình viên xuất sắc, rất giỏi!