如果 URL 与 Go 中的任何模式都不匹配,如何提供文件?
Posted
技术标签:
【中文标题】如果 URL 与 Go 中的任何模式都不匹配,如何提供文件?【英文标题】:How to serve a file if URL doesn't match to any pattern in Go? 【发布时间】:2016-07-30 23:51:57 【问题描述】:我正在使用 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
?
【问题讨论】:
【参考方案1】:我认为您需要更改 angular2 应用程序中的 URL 提供程序设置以使用 HashLocationStrategy。使用它,您的路线将采用以下形式
#/帖子
并且不会在您的 golang 应用中触发任何路由。
【讨论】:
【参考方案2】:嗯,其实这很容易。
net/http
文档 says 这个:
请注意,由于以斜杠结尾的模式命名了有根子树, 模式“/”匹配所有其他注册不匹配的路径 模式,而不仅仅是带有 Path == "/" 的 URL。
所以我需要对我的"/"
处理程序做一些事情。 http.FileServer
在模式字符串中指定的目录中查找文件,因此我将其替换为:
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request)
http.ServeFile(w, r, mysiteRoot + "index.html")
)
而且效果很好。
【讨论】:
以上是关于如果 URL 与 Go 中的任何模式都不匹配,如何提供文件?的主要内容,如果未能解决你的问题,请参考以下文章
如果 url 模式不匹配,Django 如何重定向到 404 页面