如果 URL 与 Go 中的任何模式都不匹配,如何提供文件?

How to serve a file if URL doesn't match to any pattern in Go?

我正在使用 Angular 2 和 Go 构建单页应用程序,在 Angular 中我使用路由。如果我在 http://example.com/ 打开网站,Go 会为我提供 index.html 文件,这很好,因为我写了这个:

mux.Handle("/", http.FileServer(http.Dir(mysiteRoot)))

现在我在 Angular 中有一条路线,比方说,/posts,如果它是默认路线(即,当 useAsDefaulttrue 时)或如果我只是手动转到 http://example.com/posts,我会从 Go 收到 404 错误,这意味着没有为此路径指定处理程序。

我认为在 Go 中为每个 Angular 路由创建一个处理程序不是一个好主意,因为可能有很多路由。所以我的问题是,如果请求 URL 与我在 ServeMux 中设置的任何其他模式不匹配,我如何在 Go 中提供 index.html

我认为您需要更改 angular2 应用程序中的 URL 提供程序设置才能使用 HashLocationStrategy。使用它,您的路线将采用

形式

#/posts

并且不会在您的 golang 应用程序中触发任何路由。

嗯,这其实很简单。 net/http 文档 says 这个:

Note that since a pattern ending in a slash names a rooted subtree, the pattern "/" matches all paths not matched by other registered patterns, not just the URL with Path == "/".

所以我需要用我的 "/" 处理程序做点什么。 http.FileServer 在模式字符串中指定的目录中查找文件,因此我将其替换为:

mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    http.ServeFile(w, r, mysiteRoot + "index.html")
})

而且效果很好。