Static file server in Golang using gorilla/mux

匿名 (未验证) 提交于 2019-12-03 01:39:01

问题:

I have made a app where I need to serve the same files to multiple routes because the front end is a React app. I have been using gorilla mux for the router. The file structure is as follows:

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

The files are refereed to assuming they are at the root of the file directory. So in the html file they are requested like '/static/js/main.js'.

In main my routes are defined as follows:

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

This way I get the index.html file served in both the '/' and '/student' route. If I have them the other way around the '/student' path gets a 404 error. So what I am asking is there another way to serve the same content for both of these routes in order for me not have to define a route for each view I will have in my web app.

回答1:

I've had this exact setup on multiple occasions.

You will need a file server that serves all static assets. A file server to serve your index.html file on all unhandled routes. A (I assume) a sub router for all API calls to your server.

Here is an example that should match your file structure.

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


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!