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?

24
demandé sur eduncan911 2015-01-14 17:30:19

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
26
répondu icza 2015-01-18 21:06:08

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

2
répondu Youngsoo Yi 2017-12-27 19:54:43

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.

1
répondu seafooler 2017-08-26 21:44:34