main.go
package main
import (
"net/http"
)
func main() {
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
http.ListenAndServe(":8080", nil)
}
Structure du répertoire:
%GOPATH%/src/project_name/main.go
%GOPATH%/src/project_name/static/..files and folders ..
Même après avoir lu la documentation, j'ai du mal à comprendre ce que http.StripPrefix
fait exactement ici.
1) Pourquoi ne puis-je pas accéder à localhost:8080/static
si je supprime http.StripPrefix
?
2) Quelle URL correspond au dossier /static
si je supprime cette fonction?
http.StripPrefix()
transmet le traitement de la demande à un paramètre que vous spécifiez, mais il modifie auparavant l'URL de la demande en supprimant le préfixe spécifié.
Ainsi, par exemple dans votre cas si le navigateur (ou un client HTTP) demande la ressource:
/static/example.txt
StripPrefix
coupera le /static/
et transmettra la demande modifiée au gestionnaire renvoyé par http.FileServer()
afin qu'il voie que la ressource demandée est
/example.txt
La Handler
renvoyée par http.FileServer()
cherchera et servira le contenu d'un fichier relatif dans le dossier (ou plutôt FileSystem
) spécifié en tant que paramètre (vous avez spécifié "static"
comme étant la racine des fichiers statiques).
Maintenant, puisque "example.txt"
est dans le dossier static
, vous devez spécifier un chemin relatif à celui-ci pour obtenir le chemin du fichier correct.
Cet exemple se trouve sur la page de documentation du paquet http ( ici ):
// To serve a directory on disk (/tmp) under an alternate URL
// path (/tmpfiles/), use StripPrefix to modify the request
// URL's path before the FileServer sees it:
http.Handle("/tmpfiles/",
http.StripPrefix("/tmpfiles/", http.FileServer(http.Dir("/tmp"))))
Explication:
FileServer()
est informé que la racine des fichiers statiques est "/tmp"
. Nous voulons que l'URL commence par "/tmpfiles/"
. Donc, si quelqu'un demande "/tempfiles/example.txt"
, nous voulons que le serveur envoie le fichier "/tmp/example.txt"
.
Pour ce faire, nous devons effacer "/tmpfiles"
de l'URL, le reste sera le chemin relatif par rapport au dossier racine "/tmp"
qui, si nous rejoignons, donne:
/tmp/example.txt
J'ai un dossier
/home/go/src/js/kor.js
Ensuite, dites au serveur de fichiers de servir le répertoire local
fs := http.FileServer(http.Dir("/home/go/src/js"))
Maintenant, le serveur de fichiers prend la demande "/"
en tant que "/home/go/src/js"+"/"
http.Handle("/", fs)
Oui, la requête http://localhost/kor.js
indique au serveur de fichiers, recherchez kor.js
dans
"/home/go/src/js" + "/" + "kor.js".
nous avons eu le fichier kor.js
.
Mais, si nous ajoutons un nom de requête supplémentaire.
http.Handle("/static/", fs)
Maintenant, le serveur de fichiers prend la demande "/static/"
en tant que "/home/go/src/js"+"/static/"
Oui, la requête http://localhost/static/kor.js
indique au serveur de fichiers, recherchez kor.js
dans
"/home/go/src/js" + "/static/" + "kor.js".
Nous avons eu une erreur 404.
donc, nous modifions l'URL de la requête avant que Fileserver le prenne avec http.StripPrefix("/tmpfiles/", ...
après stripPrefix
serveur de fichiers, prenez /
à la place de /static/
"/home/go/src/js" + "/" + "kor.js".
a obtenu kor.js
Je répondrai aux deux questions une à une.
Répondez 1 à la question 1: Si votre code est écrit comme ci-dessous:
http.Handle("/static/", http.FileServer(http.Dir("static"))
votre dossier racine est %GOPATH%/src/project_name/static/
. Lorsque vous accédez à localhost:8080/static
, l'URL /static
sera transmise au gestionnaire renvoyé par http.FileServer () . Cependant, vous n'avez aucun répertoire ou fichier nommé static
dans le dossier racine.
Réponse 2 à la question 2: En général, vous ne pouvez pas accéder au dossier /static
si vous supprimez le http.StripPrefix () . Toutefois, si vous avez un répertoire ou un fichier nommé static
, vous pouvez y accéder (exactement pas le répertoire racine souhaité) avec l'URL localhost:8080:/static
.
Soit dit en passant, vous ne pouvez accéder à rien si votre URL ne commence pas par /static
, car le http.ServeMux
ne redirigera pas votre demande.