如果 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
,如果它是默认路线(即,当 useAsDefault
为 true
时)或如果我只是手动转到 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")
})
而且效果很好。
我正在使用 Angular 2 和 Go 构建单页应用程序,在 Angular 中我使用路由。如果我在 http://example.com/
打开网站,Go 会为我提供 index.html
文件,这很好,因为我写了这个:
mux.Handle("/", http.FileServer(http.Dir(mysiteRoot)))
现在我在 Angular 中有一条路线,比方说,/posts
,如果它是默认路线(即,当 useAsDefault
为 true
时)或如果我只是手动转到 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")
})
而且效果很好。