为 URL 的所有子目录提供默认页面
Serve default page for all subdirs of URL
我想这样调用 FileServer
,它为不同目录 (subdirs
) 的所有子目录提供相同的页面。
天真的方法当然行不通:
for _, prefix := range subdirs {
fsDist := http.FileServer(http.Dir(defaultPage))
r.PathPrefix(prefix).Handler(http.StripPrefix(prefix, fsDist))
}
因为 /abc/123
映射到 defaultPage/123
而我只需要 defaultPage
.
比如subdirs := []string{"abc", "xyz"}
,应该这样映射:
abc/xyz => defaultPage
abc/def => defaultPage
xyz/aaa => defaultPage
我知道我需要 http.SetPrefix
或类似的东西,但没有那种东西。当然,我可以编写自己的处理程序,但我想知道这里的标准方法是什么?
这个任务很常见,我想应该有一些标准化的方法吧?
编辑:多路由支持和静态文件服务:
听起来你只是想要:
r := mux.NewRouter()
r.HandleFunc("/products", ProductsHandler) // some other route...
staticFilePath := "catch-all.txt"
fh := http.HandlerFunc(
func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, staticFilePath)
},
)
for _, dir := range []string{"abc", "xyz"} {
r.PathPrefix("/" + dir + "/").Handler(fh)
}
工作示例(运行 操场外):https://play.golang.org/p/MD1Tj1CUcEh
$ curl localhost:8000/abc/xyz
catch all
$ curl localhost:8000/abc/def
catch all
$ curl localhost:8000/xyz/aaa
catch all
$ curl localhost:8000/products
product
我想这样调用 FileServer
,它为不同目录 (subdirs
) 的所有子目录提供相同的页面。
天真的方法当然行不通:
for _, prefix := range subdirs {
fsDist := http.FileServer(http.Dir(defaultPage))
r.PathPrefix(prefix).Handler(http.StripPrefix(prefix, fsDist))
}
因为 /abc/123
映射到 defaultPage/123
而我只需要 defaultPage
.
比如subdirs := []string{"abc", "xyz"}
,应该这样映射:
abc/xyz => defaultPage
abc/def => defaultPage
xyz/aaa => defaultPage
我知道我需要 http.SetPrefix
或类似的东西,但没有那种东西。当然,我可以编写自己的处理程序,但我想知道这里的标准方法是什么?
这个任务很常见,我想应该有一些标准化的方法吧?
编辑:多路由支持和静态文件服务:
听起来你只是想要:
r := mux.NewRouter()
r.HandleFunc("/products", ProductsHandler) // some other route...
staticFilePath := "catch-all.txt"
fh := http.HandlerFunc(
func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, staticFilePath)
},
)
for _, dir := range []string{"abc", "xyz"} {
r.PathPrefix("/" + dir + "/").Handler(fh)
}
工作示例(运行 操场外):https://play.golang.org/p/MD1Tj1CUcEh
$ curl localhost:8000/abc/xyz
catch all
$ curl localhost:8000/abc/def
catch all
$ curl localhost:8000/xyz/aaa
catch all
$ curl localhost:8000/products
product