为 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