Pourquoi ai-je besoin pour utiliser le protocole http.StripPrefix pour accéder à mes fichiers statiques?
Principal.aller
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?
3 réponses
http.StripPrefix()
transmet la gestion de la requête à celle que vous spécifiez comme paramètre, mais avant cela, il modifie l'URL de la requête 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 requête modifiée au gestionnaire renvoyé par http.FileServer()
donc, il verra que la ressource demandée est
/example.txt
Le Handler
renvoyé par http.FileServer()
va rechercher et servir le contenu d'un fichier relatif au dossier (ou plutôt FileSystem
) spécifié comme paramètre (vous avez spécifié "static"
comme étant la racine des fichiers statiques).
Maintenant que "example.txt"
se trouve dans le dossier static
, Vous devez spécifier un chemin relatif pour obtenir le chemin du fichier corrent.
Un Autre Exemple
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 dit de 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 y parvenir, nous devons supprimer "/tmpfiles"
de L'URL, et le reste sera le chemin relatif par rapport au dossier racine {[15] } qui si nous rejoignons donne:
/tmp/example.txt
Supposons que
J'ai un fichier
/home/go/src/js/kor.js
Ensuite, dites à fileserve de servir le répertoire local
fs := http.FileServer(http.Dir("/home/go/src/js"))
Exemple 1-url racine de Filerserver root
Maintenant, serveur de fichiers prend "/"
demande de "/home/go/src/js"+"/"
http.Handle("/", fs)
Oui http://localhost/kor.js
demande, dit serveur de Fichiers, trouver kor.js
dans
"/home/go/src/js" + "/" + "kor.js".
Nous avons un fichier kor.js
.
Example2-url personnalisée à la racine du serveur de fichiers
Mais, si nous ajoutons un nom de requête supplémentaire.
http.Handle("/static/", fs)
Maintenant, le serveur de fichiers prend "/static/"
demande en tant que "/home/go/src/js"+"/static/"
Oui http://localhost/static/kor.js
demande, dit serveur de Fichiers, trouver kor.js
dans
"/home/go/src/js" + "/static/" + "kor.js".
Nous avons eu une erreur 404.
Exemple 3-url personnalisée à la racine du serveur de fichiers avec
Donc, nous modifions l'url de la requête avant que le serveur de fichiers ne l'accepte avec http.StripPrefix("/tmpfiles/", ...
Après stripPrefix
le serveur de fichiers prend /
à la place /static/
"/home/go/src/js" + "/" + "kor.js".
Got kor.js
Je vais répondre aux deux questions une par une.
Réponse 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 {[3] } 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 http.StripPrefix () . Cependant, si vous avez un répertoire ou un fichier nommé static
, Vous pouvez y accéder (exactement pas le répertoire racine que vous voulez ) avec L'URL localhost:8080:/static
.
En passant, vous ne pouvez pas accéder à quoi que ce soit si votre URL ne commence pas par /static
, car le http.ServeMux
ne redirigera pas votre requête.