Warum benötige ich für die Verwendung von http.StripPrefix Zugriff auf meine Dateien?
main.gehen
package main
import (
"net/http"
)
func main() {
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
http.ListenAndServe(":8080", nil)
}
Verzeichnis-Struktur:
%GOPATH%/src/project_name/main.go
%GOPATH%/src/project_name/static/..files and folders ..
Selbst nach Lesen der Dokumentation habe ich Schwierigkeiten zu verstehen, was genau http.StripPrefix
nicht hier.
1) Warum kann ich nicht zugreifen localhost:8080/static
wenn ich entfernen http.StripPrefix
?
2) Welche URL-Karten zu /static
Ordner, wenn ich die entfernen-Funktion?
- Haben Sie versucht http.Handle("/static/", http.FileServer(http.Dir("/")))?
http.Handle("/static/", http.FileServer(http.Dir("")))
funktioniert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
http.StripPrefix()
leitet den Umgang mit der Anforderung an eine Sie als der parameter, aber vor, dass es ändert die URL-Anforderung durch Strippen aus dem angegebenen Präfix.Also zum Beispiel in deinem Fall, wenn der browser (oder ein HTTP-client) fordert die Ressource an:
StripPrefix
schneiden die/static/
vorwärts " und die veränderten Anforderung an den Behandler zurückgegebenhttp.FileServer()
wird es so sehen, dass die angeforderte Ressource istDen
Handler
zurückgegebenhttp.FileServer()
suchen wird, und servieren Sie den Inhalt einer Datei relative, um den Ordner (oder eherFileSystem
) angegeben, die die parameter (die Sie angegeben"static"
auf die Wurzel des statischen Dateien).Nun seit
"example.txt"
ist in derstatic
Ordner, müssen Sie einen relativen Pfad angeben, um das, um die corrent-Datei Pfad.Ein Weiteres Beispiel
Diesem Beispiel finden Sie auf der http-Paket-Dokumentation Seite (hier):
Erklärung:
FileServer()
erzählt wird die Wurzel von statischen Dateien ist"/tmp"
. Wir möchten, dass die URL mit zu beginnen"/tmpfiles/"
. Also, wenn jemand Wünsche"/tempfiles/example.txt"
wir wollen, dass der server zum senden der Datei"/tmp/example.txt"
.Um dies zu erreichen, müssen wir Streifen
"/tmpfiles"
aus der URL, und die übrigen werden, der den relativen Pfad im Vergleich zu den root-Ordner"/tmp"
was, wenn wir uns gibt:/tmpfiles/
oder Sie haben eine schlechte Zeit./tmpfile/
im Griff ist wichtig, aber nicht in StripPrefix, sagen wir malhttp.Handle("/tmpfiles/", http.StripPrefix("/tmpfiles", http.FileServer(http.Dir("/tmp"))))
wird auch funktionierenDavon ausgehen, dass
Ich habe eine Datei
Dann sagen, fileserve serviert lokale Verzeichnis
Beispiel 1 - root-url zum Filerserver root -
Nun mit file-server nimmt
"/"
Anfrage"/home/go/src/js"+"/"
Ja,
http://localhost/kor.js
Anfrage sagt, Fileserver, findenkor.js
imwir haben
kor.js
Datei.Beispiel2 - benutzerdefinierte url zum Fileserver root
Aber, wenn wir hinzufügen, zusätzliche resquest Namen.
Nun mit file-server nimmt
"/static/"
Anfrage"/home/go/src/js"+"/static/"
Ja,
http://localhost/static/kor.js
Anfrage sagt, Fileserver, findenkor.js
imWir haben 404-Fehler.
Beispiel 3 - benutzerdefinierte url zum Fileserver root mit
so, wir ändern request-url, bevor Fileserver nimmt es mit
http.StripPrefix("/tmpfiles/", ...
nach
stripPrefix
Fileserver nehmen/
statt/static/
bekam
kor.js
Ich beantworte dir die beiden Fragen eine nach der anderen.
Antwort 1 zu Frage 1:
Wenn der code geschrieben wird, wie unten:
Ihrem root-Ordner ist
%GOPATH%/src/project_name/static/
. Wenn Sie auflocalhost:8080/static
die URL/static
werden an den handler zurückgegeben http.FileServer(). Jedoch, Sie haben kein Verzeichnis oder Datei mit dem Namenstatic
im root-Ordner.Antwort 2 zu Frage 2: Im Allgemeinen, Sie können nicht auf
/static
- Ordner, wenn Sie entfernen die http.StripPrefix(). Allerdings, wenn Sie haben ein Verzeichnis oder eine Datei mit dem Namenstatic
können Sie darauf zugreifen (genau nicht das root-Verzeichnis, das Sie wollen) mit der URLlocalhost:8080:/static
.Durch die Art und Weise, können Sie nicht Zugriff auf alles, wenn Ihr die URL beginnt nicht mit
/static
, weil diehttp.ServeMux
wird nicht umleiten Ihre Anfrage.