Golang中的静态文件服务器使用gorilla / mux

时间:2018-02-05 20:01:12

标签: go routing gorilla

我已经创建了一个应用程序,我需要将相同的文件提供给多个路由,因为前端是一个React应用程序。我一直在使用gorilla mux作为路由器。 文件结构如下:

main.go
build/
  | index.html
  | service-worker.js
     static/
       |  js/
           | main.js
       |  css/
           | main.css

文件被称为假设它们位于文件目录的根目录。所以在html文件中,他们被请求像'/static/js/main.js'。

在主要路线中我的路线定义如下:

r.PathPrefix("/student").Handler(http.StripPrefix("/student",http.FileServer(http.Dir("build/")))).Methods("GET")
r.PathPrefix("/").Handler(http.FileServer(http.Dir("build/"))).Methods("GET")

这样我就可以在'/'和'/ student'路径中获得index.html文件。如果我有它们,那么围绕'/ student'路径会出现404错误。所以我要问的是有另一种方法为这两条路线提供相同的内容,以便我不必为我的网络应用中的每个视图定义一条路线。

1 个答案:

答案 0 :(得分:3)

我已多次进行过这种精确设置。

您需要一个服务于所有静态资产的文件服务器。用于在所有未处理的路由上提供index.html文件的文件服务器。 A(我假设)一个子路由器,用于对服务器的所有API调用。

以下示例应与您的文件结构相匹配。

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/mux"
)

func main() {
    r := mux.NewRouter()

    // Handle API routes
    api := r.PathPrefix("/api/").Subrouter()
    api.HandleFunc("/student", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "From the API")
    })

    // Serve static files
    r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir("./build/static/"))))

    // Serve index page on all unhandled routes
    r.PathPrefix("/").HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        http.ServeFile(w, r, "./build/index.html")
    })

    fmt.Println("http://localhost:8888")
    log.Fatal(http.ListenAndServe(":8888", r))
}