使用Gorilla Mux提供静态HTML

I'm using gorilla serve mux to serve static html files.

r := mux.NewRouter()
r.PathPrefix("/").Handler(http.FileServer(http.Dir("./public"))).Methods("GET")

I do have a Index.html file inside the public folder as well as other html files.

When browsing the site I get all the content of the folder instead of the default Index.html.

I came from C# and I know that IIS takes Index.html as default but it is possible to select any page as a default.

I wanted to know if there's a proper way to select a default page to serve in Gorilla mux without creating a custom handler/wrapper.

After grabthefish mentioned it i decided to check the actual code of gorilla serve mux. This code is taken from net/http package which Gorilla mux is based on.

func serveFile(w ResponseWriter, r *Request, fs FileSystem, name string, 
redirect bool) {
const indexPage = "/index.html"

// redirect .../index.html to .../
// can't use Redirect() because that would make the path absolute,
// which would be a problem running under StripPrefix
if strings.HasSuffix(r.URL.Path, indexPage) {
    localRedirect(w, r, "./")
    return
}

the code request the index file to be index.html in lower case so renaming my index file solved it. thank you grabthefish!

Maybe using a custom http.HandlerFunc would be easier:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    // Here you can check if path is empty, you can render index.html
    http.ServeFile(w, r, r.URL.Path)
})

You do have to make a custom handler because you want a custom behavior. Here, I just wrapped the http.FileServer handler.

Try this one:

package main

import (
    "log"
    "net/http"

    "github.com/gorilla/mux"
)

func main() {

    handler := mux.NewRouter()

    fs := http.FileServer(http.Dir("./public"))
    handler.PathPrefix("/").Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        if r.URL.Path == "/" {
            //your default page
            r.URL.Path = "/my_default_page.html"
        }

        fs.ServeHTTP(w, r)
    })).Methods("GET")

    log.Fatal(http.ListenAndServe(":8080", handler))
}

So, from the code, if the visited path is the root (/) then you rewrite the r.URL.Path to your default page, in this case my_default_page.html.