如果 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,如果它是默认路由(即,当 useAsDefaulttrue)或者我只是手动转到 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 页面

当firebase查询与数据库中的任何内容都不匹配时如何调用函数

Django - 当前的URL,与其中任何一个都不匹配

当前 URL 与其中任何一个都不匹配 - 使用多个站点

当前 URL app/ 与其中任何一个都不匹配

混合测试 - 测试模式与任何文件都不匹配