web-dev-qa-db-fra.com

Pourquoi dois-je utiliser http.StripPrefix pour accéder à mes fichiers statiques?

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?

29
Dante

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.

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 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
31
icza

Suppose que

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"))

Exemple 1 - URL racine de la racine Filerserver

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.

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 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.

Exemple 3 - URL personnalisée à la racine du serveur de fichiers avec

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

2
Youngsoo Yi

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.

1
seafooler