How to use FileServer with Gorilla’s Subrouter
I’ve just spent much more time than I ever wanted to get this right, so here’s how I did it for future reference.
I have a function that returns an http.Handler
, kind of like this:
func Handler(prefix string) http.Handler {
r := mux.NewRouter().PathPrefix(prefix).Subrouter()
r.HandleFunc("/foo/", fooHandler).Methods("GET")
r.HandleFunc("/bar/", barHandler).Methods("GET")
return r
}
The prefix
could be something like “/api/” or “/ui” or whatever, so this http.Handler
will serve /api/foo
and /api/bar
, for example. So far so good.
Now, I also want to serve some static files under the prefix’s “root” (again, something like “/api/”.) My initial thinking was something like this:
r.Handle("/", http.StripPrefix(prefix, http.Dir("./somedir")))
It works fine for anything under the root of “./somedir” but it failed with a 404 error for anything under different subdirectories. I found some answers online, but they never seemed to use a subrouter and thus didn’t work for me at all.
I finally figured it out:
r.PathPrefix("/").Handler(http.StripPrefix(prefix, http.FileServer(http.Dir("./somedir"))))
It wasn’t obvious to me at all.