我似乎无法正确使用我的路由。我正在使用Gorilla Mux并尝试提供我的角度应用,所以基本上我的index.html,来自任何网址,除了他们以#34; / foo"开头。
这个有效:
func StaticFileServer(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, config.dir)
}
func main() {
fs := http.Dir(config.dir)
fileHandler := http.FileServer(fs)
router = mux.NewRouter()
router.Handle("/foo/page", PublicHandler(handler(getAll)).Methods("GET")
router.Handle("/foo/page/{id}", PublicHandler(handler(getOne)).Methods("GET")
router.PathPrefix("/{blaah}/{blaah}/").Handler(fileHandler)
router.PathPrefix("/").HandlerFunc(StaticFileServer)
...
}
但必须有一个比明确声明每条可能路线更简单的方法,比如这个PathPrefix(" / {blaah} / {blaah} /")东西...... 有了这个,除了/ {blaah} / {blaah} /之外的任何其他网址都会返回找不到的404页面,而不是index.html。
所以我希望只要找到所有内容(静态文件等),但其他所有内容都应该返回/public/index.html。
答案 0 :(得分:0)
我有点迟了,但其他人可能会觉得我的答案很有用。
基本上Gorilla Mux正在这里完成所有的工作。我假设您希望AngularJS为任何不以“/ foo”开头的URL进行路由。
您可以使用正则表达式将任何不以“/ foo”开头的请求发送到index.html:
router.PathPrefix("/{_:.*}").HandlerFunc(StaticFileServer)
答案 1 :(得分:0)
我也面临着同样的问题,但是如果我们使用大猩猩多路复用器,我们将有一个明确的解决方案。
因为Angular是一个单页应用程序,所以我们必须采用这种方式。我有两个文件夹客户端和服务器。在client文件夹中,我保留所有角度代码,在server文件夹中,我保留所有服务器代码,因此呈现index.html的静态路径是“ client / dist”。这里dist文件夹是一个有角度的构建文件夹。
Go路由器代码如下-
func main {
router := mux.NewRouter()
spa := spaHandler{staticPath: "client/dist", indexPath: "index.html"}
router.PathPrefix("/").Handler(spa)
}
spaHandler实现了http.Handler接口,因此我们可以使用它 响应HTTP请求。静态目录的路径和 该静态目录中索引文件的路径用于 在给定的静态目录中提供SPA。
type spaHandler struct {
staticPath string
indexPath string
}
ServeHTTP检查URL路径以在静态目录中找到文件 在SPA处理程序上。如果找到文件,则将其提供。如果没有, 位于SPA处理程序上索引路径中的文件将被投放。这个 是用于SPA(单页应用程序)的合适行为。
func (h spaHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// get the absolute path to prevent directory traversal
path, err := filepath.Abs(r.URL.Path)
if err != nil {
// if we failed to get the absolute path respond with a 400 bad request
// and stop
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
// prepend the path with the path to the static directory
path = filepath.Join(h.staticPath, path)
// check whether a file exists at the given path
_, err = os.Stat(path)
if os.IsNotExist(err) {
// file does not exist, serve index.html
http.ServeFile(w, r, filepath.Join(h.staticPath, h.indexPath))
return
} else if err != nil {
// if we got an error (that wasn't that the file doesn't exist) stating the
// file, return a 500 internal server error and stop
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// otherwise, use http.FileServer to serve the static dir
http.FileServer(http.Dir(h.staticPath)).ServeHTTP(w, r)
}