web-dev-qa-db-fra.com

Servir du contenu statique avec une URL racine avec la boîte à outils Gorilla

J'essaie d'utiliser mux package du Gorilla toolkit pour router les URL sur un serveur Web Go. En utilisant cette question comme guide, j'ai le code Go suivant:

func main() {
    r := mux.NewRouter()
    r.Handle("/", http.FileServer(http.Dir("./static/")))
    r.HandleFunc("/search/{searchTerm}", Search)
    r.HandleFunc("/load/{dataId}", Load)
    http.Handle("/", r)
    http.ListenAndServe(":8100", nil)
}

La structure du répertoire est la suivante:

...
main.go
static\
  | index.html
  | js\
     | <js files>
  | css\
     | <css files>

Les fichiers Javascript et CSS sont référencés dans index.html comme ça:

...
<link rel="stylesheet" href="css/redmond/jquery-ui.min.css"/>
<script src="js/jquery.min.js"></script>
...

Lorsque j'accède à http://localhost:8100 dans mon navigateur Web, le index.html le contenu est livré avec succès, cependant, toutes les URL js et css renvoient 404s.

Comment puis-je obtenir le programme pour servir des fichiers à partir de sous-répertoires static?

53
jason

Je pense que vous cherchez PathPrefix...

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/search/{searchTerm}", Search)
    r.HandleFunc("/load/{dataId}", Load)
    r.PathPrefix("/").Handler(http.FileServer(http.Dir("./static/")))
    http.ListenAndServe(":8100", r)
}
78
Chris Farmiloe

Après beaucoup d'essais et d'erreurs, les deux réponses ci-dessus m'ont aidé à trouver ce qui a fonctionné pour moi. J'ai un dossier statique dans le répertoire racine de l'application Web.

Avec PathPrefix, j'ai dû utiliser StripPrefix pour que la route fonctionne récursivement.

package main

import (
    "log"
    "net/http"
    "github.com/gorilla/mux"
)

func main() {
    r := mux.NewRouter()
    s := http.StripPrefix("/static/", http.FileServer(http.Dir("./static/")))
    r.PathPrefix("/static/").Handler(s)
    http.Handle("/", r)
    err := http.ListenAndServe(":8081", nil)
}

J'espère que cela aide quelqu'un d'autre à avoir des problèmes.

40
codefreak

J'ai ici ce code qui fonctionne assez bien et est réutilisable.

func ServeStatic(router *mux.Router, staticDirectory string) {
    staticPaths := map[string]string{
        "styles":           staticDirectory + "/styles/",
        "bower_components": staticDirectory + "/bower_components/",
        "images":           staticDirectory + "/images/",
        "scripts":          staticDirectory + "/scripts/",
    }
    for pathName, pathValue := range staticPaths {
        pathPrefix := "/" + pathName + "/"
        router.PathPrefix(pathPrefix).Handler(http.StripPrefix(pathPrefix,
            http.FileServer(http.Dir(pathValue))))
    }
}
router := mux.NewRouter()
ServeStatic(router, "/static/")
9
Thomas Modeneis

Essaye ça:

fileHandler := http.StripPrefix("/static/", http.FileServer(http.Dir("/absolute/path/static")))
http.Handle("/static/", fileHandler)
4
Joe