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