golang 使用 go:embed 提供静态文件导致 404

问题描述 投票:0回答:1

我有以下树结构

$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 并且没有帮助。

go embed
1个回答
0
投票

我发现的一个问题是,您在 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”端点。它现在应该正确地提供嵌入的静态文件。

© www.soinside.com 2019 - 2024. All rights reserved.