使用Angular.js使用Gorilla Mux路由

时间:2014-10-21 10:02:26

标签: go routing mux gorilla

我似乎无法正确使用我的路由。我正在使用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。

2 个答案:

答案 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)
}