英文:
Go http.FileServer gives unexpected 404 error
问题
我正在尝试运行两个文件服务器,其中一个服务器在ui
文件夹中提供index.html
,另一个服务器提供其他静态文件,代码如下:
package main
import (
"log"
"net/http"
)
func main() {
srv := http.NewServeMux()
// 文件服务器1
uiServer := http.FileServer(http.Dir("./ui"))
srv.Handle("/", uiServer)
// 文件服务器2
staticFilesServer := http.FileServer(http.Dir("./files"))
srv.Handle("/files", staticFilesServer)
if err := http.ListenAndServe(":8080", srv); err != nil {
log.Fatal(err)
}
}
两个文件服务器对象的定义方式完全相同,第一个(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
更改为/
,它将按预期工作,但这不是我想要的,我只想知道是否可以在除了/
之外的路径上提供服务,以及如何实现。
另外,我的文件夹结构如下:
|- main.go
|- ui
|--- index.html
|- files
|--- file1.txt
|--- file2.csv
|--- file3.img
英文:
I'm trying to run two file servers, one of them serving index.html
in the ui
folder, and one other serving some other static files, like the code below:
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)
}
}
Both fileServer objects are defined in the exact same way, and the first one (uiServer) works fine, but the second (staticFilesServer on localhost:8080/files
), gives me 404.
I narrowed down the problem and removed the first one (working file server), just like the code below:
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)
}
}
But it still gives me 404 on the path localhost:8080/files
If I change handle path from /files
to /
, it works as expected, but that's not what i want, I just want to know is it even possible to serve on paths other than /
and how can I achieve that.
Also, my folder structure:
|- main.go
|- ui
|--- index.html
|- files
|--- file1.txt
|--- file2.csv
|--- file3.img
答案1
得分: 3
我意识到http.Dir()
和http.ServeMux.Handle()
之间存在关联,它们实际上将它们的路径相加,如下所示:
srv.Handle("/files/", http.FileServer(http.Dir(".")))
上面的代码将服务于./files
文件夹中的所有内容,而不是.
(如Dir(".")
中所写)。
这解决了我的问题。
英文:
I realized that http.Dir()
and http.ServeMux.Handle()
would have a relation, they actually sum up their paths, as show below:
srv.Handle("/files/", http.FileServer(http.Dir("."))
Code above serves everything inside ./files
folder, not .
(as written in Dir(".")
)
And it fixed my problem.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论