我正在try 运行两个文件服务器,其中一个在ui文件夹中提供index.html服务,另一个提供其他一些静态文件,如以下代码所示:

package main

import (
    "log"
    "net/http"
)

func main() {
    srv := http.NewServeMux()

    // File server 1
    uiServer := http.FileServer(http.Dir("./ui"))
    srv.Handle("/", uiServer)

    // File server 2
    staticFilesServer := http.FileServer(http.Dir("./files"))
    srv.Handle("/files", staticFilesServer)

    if err := http.ListenAndServe(":8080", srv); err != nil {
        log.Fatal(err)
    }
}

两个fileServer对象的定义方式完全相同,第一个对象(UiServer)运行良好,但第二个对象(localhost:8080/files上的staticFilesServer)给我404.


我缩小了问题范围并删除了第一个问题(工作文件服务器),就像下面的代码一样:

package main

import (
    "log"
    "net/http"
)

func main() {
    srv := http.NewServeMux()

    staticFilesServer := http.FileServer(http.Dir("./files"))
    srv.Handle("/files", staticFilesServer)

    if err := http.ListenAndServe(":8080", srv); err != nil {
        log.Fatal(err)
    }
}

但它仍然给了我在localhost:8080/files号路上的404


如果我将句柄路径从/files更改为/,它会按预期工作,但这不是我想要的,我只想知道是否可以在/以外的路径上提供服务,以及如何实现这一点.


另外,我的文件夹 struct :

|- main.go
|- ui
|--- index.html
|- files
|--- file1.txt
|--- file2.csv
|--- file3.img

推荐答案

我意识到http.Dir()http.ServeMux.Handle()是有联系的,它们实际上总结了它们的路径,如下所示:

srv.Handle("/files/", http.FileServer(http.Dir("."))

上面的代码服务于./files文件夹内的所有内容,而不是.(如Dir(".")中所写) 它解决了我的问题.

Go相关问答推荐

如何创建两个连接的io.ReadWriteClosers以用于测试目的

golang有int32溢出吗?

正则表达式模式,确保至少一个字符与其他条件一起存在

Docker 执行失败并显示cmd/ENTRYPOINT 中的命令未找到

Kperf 构建失败

使用 OpenTelemetry 统一不同服务的范围

替换字符串中的最后一个字符

Go Template if 条件

对 CSV 进行单元测试失败

如何以干净的方式在中间件中注入 repo 或服务?

你如何在 Golang 代码中测试 filepath.Abs​​ 失败?

golang yaml 马歇尔网址

如何在 Docker 容器中使用私有存储库进行身份验证

Go 并发、goroutine 同步和关闭通道

是否可以使用按位运算在随机 unicode 字符串中找到重复字符?

在 Go 中将指针传递给函数的正确方法是什么,以便我可以读取和/或修改指针表示的值?

Go:用于 XML 解码的嵌套 struct 中的提升字段

golangci-lint 的 GitHub 操作失败,无法加载 fmt

有没有办法在golang中映射一组对象?

在 go (1.18) 的泛型上实现多态的最佳方法是什么?