我有以下树结构
$tree
.
├── cmd
│ └── main.go
├── go.mod
└── public
└── static-file.html
.go 主要内容有:
package main
import (
"embed"
"io/fs"
"log"
"net/http"
)
// go:embed public
var public embed.FS
func main() {
// cd to the public directory
publicFS, err := fs.Sub(public, "public")
if err != nil {
log.Fatal(err)
}
http.Handle("/embedded/", http.FileServer(http.FS(publicFS)))
http.Handle("/public/",
http.StripPrefix("/public/", http.FileServer(http.Dir("public"))))
log.Fatal(http.ListenAndServe(":8080", nil))
}
如果我运行上述程序并访问 /public 端点,我会得到静态文件,但是
/embedded
路径不提供内容,并且我得到 404。我做错了什么?
$go run cmd/main.go &
[1] 81301
$curl http://localhost:8080/public/static-file.html
<html>
<body>
<h1>Static File</h1>
</body>
</html>
$curl http://localhost:8080/embedded/static-file.html
404 page not found
我也尝试过使用
http.StripPrefix
,例如:
http.Handle("/embedded/", http.StripPrefix("/embedded",
http.FileServer(http.FS(publicFS))))
它也会返回 404 并且没有帮助。
我发现的一个问题是,您在 http.StripPrefix 函数中缺少一个前导正斜杠(“/”)。
代替:
http.Handle("/embedded/", http.StripPrefix("/embedded",
http.FileServer(http.FS(publicFS))))
更换它:
http.Handle("/embedded/", http.StripPrefix("/embedded/",
http.FileServer(http.FS(publicFS))))
确保在 http.StripPrefix 的前缀参数中包含尾部正斜杠(“/”),因为它代表嵌入式文件系统的根目录。
进行此更改后,尝试再次运行程序并访问“/embedded”端点。它现在应该正确地提供嵌入的静态文件。