Comment servez-vous index.html (ou un autre fichier HTML statique) à l'aide d'un serveur Web go?
Je veux juste un fichier HTML statique de base (comme un article, par exemple) que je peux servir à partir d'un serveur Web virtuel. Le code HTML doit être modifiable en dehors du programme go, comme ce serait le cas lors de l'utilisation de modèles HTML.
Ceci est mon serveur web qui héberge uniquement du texte codé en dur ("Hello world!").
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello world!")
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":3000", nil)
}
Cette tâche est très facile avec le package Golang net/http.
Tout ce que vous devez faire c'est:
package main
import (
"net/http"
)
func main() {
http.Handle("/", http.FileServer(http.Dir("./static")))
http.ListenAndServe(":3000", nil)
}
en supposant que les fichiers statiques se trouvent dans le dossier nommé static
dans le répertoire racine du projet.
Si c'est dans le dossier static
, vous aurez le fichier index.html
Appelant http://localhost:3000/
, Ce qui rendra le rendu de ce fichier d'index au lieu de lister tous les fichiers disponibles.
De plus, l'appel de tout autre fichier de ce dossier (par exemple http://localhost:3000/clients.html
) Le montrera, rendu correctement par le navigateur (au moins Chrome, Firefox et Safari :))
Si vous voulez servir des fichiers, dites à partir du dossier ./public
Sous url: localhost:3000/static
Vous devez tiliser une fonction supplémentaire: func StripPrefix(prefix string, h Handler) Handler
comme ceci:
package main
import (
"net/http"
)
func main() {
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./public"))))
http.ListenAndServe(":3000", nil)
}
Grâce à cela, tous vos fichiers de ./public
Sont disponibles sous localhost:3000/static
Sans la fonction http.StripPrefix
, Si vous tentiez d'accéder au fichier localhost:3000/static/test.html
, Le serveur le rechercherait dans ./public/static/test.html
Cela est dû au fait que le serveur traite l'URI entier comme un chemin d'accès relatif au fichier.
Heureusement, il est facile à résoudre avec la fonction intégrée.
PAS un serveur FTP: C'est quelque chose de différent de ce que je voulais, qui serait de servir la page d'accueil
index.html
, Comme le ferait un serveur Web normal. Par exemple, lorsque je vais sur mydomain.com dans mon navigateur, je veux un renduindex.html
.
C’est principalement ce que décrit " Écrire des applications Web ", et à quoi ressemble un projet hugo (générateur de site HTML statique) le fait.
Il s’agit de lire un fichier et de répondre avec un ContentType "text/html":
func (server *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
err := server.renderFile(w, r.URL.Path)
if err != nil {
w.Header().Set("Content-Type", "text/html; charset=utf-8")
w.WriteHeader(http.StatusNotFound)
server.fn404(w, r)
}
}
avec renderFile()
essentiellement lire et définir le bon type:
file, err = ioutil.ReadFile(server.MediaPath + filename)
if ext != "" {
w.Header().Set("Content-Type", mime.TypeByExtension(ext))
}