main.go
package main
import (
"net/http"
)
func main() {
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
http.ListenAndServe(":8080", nil)
}
Verzeichnisaufbau:
%GOPATH%/src/project_name/main.go
%GOPATH%/src/project_name/static/..files and folders ..
Selbst nachdem ich die Dokumentation gelesen habe, kann ich nicht verstehen, was genau http.StripPrefix
hier geschieht.
1) Warum kann ich nicht auf localhost:8080/static
zugreifen, wenn ich http.StripPrefix
entferne?
2) Welcher URL wird der Ordner /static
zugeordnet, wenn ich die Funktion entferne?
http.StripPrefix()
leitet die Verarbeitung der Anforderung an einen von Ihnen als Parameter angegebenen Wert weiter. Vorher ändert sie jedoch die Anforderungs-URL, indem das angegebene Präfix entfernt wird.
So zum Beispiel in Ihrem Fall, wenn der Browser (oder ein HTTP-Client) die Ressource anfordert:
/static/example.txt
StripPrefix
wird den /static/
abschneiden und die geänderte Anforderung an den von http.FileServer()
zurückgegebenen Handler weiterleiten, so dass die angeforderte Ressource angezeigt wird
/example.txt
Die von http.FileServer()
zurückgegebene Handler
sucht den Inhalt einer Datei relativ an den Ordner (bzw. FileSystem
), der als Parameter angegeben ist (Sie haben "static"
als Stamm der statischen Dateien angegeben).
Da sich "example.txt"
im Ordner static
befindet, müssen Sie einen relativen Pfad angeben, um den entsprechenden Dateipfad abzurufen.
Dieses Beispiel finden Sie auf der Dokumentationsseite zum http-Paket ( hier ):
// 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"))))
Erklärung:
FileServer()
sagt, dass der Stamm von statischen Dateien "/tmp"
ist. Wir möchten, dass die URL mit "/tmpfiles/"
beginnt. Wenn also jemand "/tempfiles/example.txt"
anfordert, möchten wir, dass der Server die Datei "/tmp/example.txt"
sendet.
Um dies zu erreichen, müssen wir "/tmpfiles"
von der URL entfernen, und der verbleibende Pfad ist der relative Pfad im Vergleich zum Stammordner "/tmp"
, der bei einem Join Folgendes ergibt:
/tmp/example.txt
Ich habe eine datei
/home/go/src/js/kor.js
Sagen Sie dann fileserve, dass es sich um ein lokales Verzeichnis handelt
fs := http.FileServer(http.Dir("/home/go/src/js"))
Jetzt nimmt der Dateiserver eine "/"
-Anforderung als "/home/go/src/js"+"/"
an.
http.Handle("/", fs)
Ja, http://localhost/kor.js
-Anfrage teilt Fileserver mit, kor.js
in
"/home/go/src/js" + "/" + "kor.js".
wir haben kor.js
datei.
Aber wenn wir einen zusätzlichen Namen für die Anfrage hinzufügen.
http.Handle("/static/", fs)
Jetzt nimmt der Dateiserver eine "/static/"
-Anforderung als "/home/go/src/js"+"/static/"
an.
Ja, http://localhost/static/kor.js
-Anfrage teilt Fileserver mit, kor.js
in
"/home/go/src/js" + "/static/" + "kor.js".
Wir haben 404 Fehler erhalten.
wir ändern also die Anforderungs-URL, bevor der Dateiserver sie mit http.StripPrefix("/tmpfiles/", ...
übernimmt
nach stripPrefix
Fileserver /
statt /static/
"/home/go/src/js" + "/" + "kor.js".
bekam kor.js
Ich werde die beiden Fragen einzeln beantworten.
Antwort 1 zu Frage 1: Wenn Ihr Code wie folgt geschrieben ist:
http.Handle("/static/", http.FileServer(http.Dir("static"))
ihr Stammordner ist %GOPATH%/src/project_name/static/
. Wenn Sie auf localhost:8080/static
zugreifen, wird die URL /static
an den von http.FileServer () zurückgegebenen Handler weitergeleitet. Sie haben jedoch kein Verzeichnis oder keine Datei namens static
im Stammordner.
Antwort 2 zu Frage 2: Im Allgemeinen können Sie nicht auf den Ordner /static
zugreifen, wenn Sie das http.StripPrefix () entfernen. Wenn Sie jedoch ein Verzeichnis oder eine Datei mit dem Namen static
haben, können Sie mit der URL localhost:8080:/static
auf das Verzeichnis (genau nicht das gewünschte Verzeichnis) zugreifen.
Übrigens können Sie auf nichts zugreifen, wenn Ihre URL nicht mit /static
beginnt, da http.ServeMux
Ihre Anforderung nicht umleitet.