我似乎不能让我的路由正确。我正在使用Gorilla Mux,我试图为我的Angular应用程序服务,所以基本上我的index.html,从任何url开始,除了他们以 "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}之外的任何其他url都会返回404页面未找到,而不是index.html。
所以我想让所有的东西(静态文件等)只要能被找到就能得到服务,但其他的东西都应该返回publicindex.html。
我有点晚了,但其他人可能会发现我的答案很有用。
基本上,Gorilla Mux在这里做了你所有的路由。我假设你想让AngularJS为任何不以 "foo "开头的URL做路由。
你可以使用regex将任何不以 "foo "开头的请求发送到你的index.html中。
router.PathPrefix("/{_:.*}").HandlerFunc(StaticFileServer)
我也面临着同样的问题,但如果我们使用Gorilla mux,我们有一个明确的解决方案。
因为Angular是一个单页应用,所以我们必须这样处理。我有两个文件夹客户端和服务器。在client文件夹里面我保存了我所有的angular代码,在server文件夹里面我保存了所有的server代码,所以渲染index.html的静态路径是 "clientdist"。这里dist文件夹是一个angular build文件夹。
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)
}