it-swarm.com.de

Warum muss ich http.StripPrefix verwenden, um auf meine statischen Dateien zuzugreifen?

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?

29
Dante

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.

Ein anderes Beispiel

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

Annehmen, dass

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

Beispiel 1 - Root-URL zum Filerserver-Root

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.

Beispiel2 - Benutzerdefinierte URL zum Fileserver-Stammverzeichnis

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.

Beispiel 3 - Benutzerdefinierte URL zum Fileserver-Stammverzeichnis mit

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

2
Youngsoo Yi

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.

1
seafooler