Dlaczego muszę używać http.StripPrefix, aby uzyskać dostęp do moich plików statycznych?
Main.go
package main
import (
"net/http"
)
func main() {
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
http.ListenAndServe(":8080", nil)
}
Struktura katalogu:
%GOPATH%/src/project_name/main.go
%GOPATH%/src/project_name/static/..files and folders ..
Nawet po przeczytaniu dokumentacji mam problem ze zrozumieniem, co dokładnie http.StripPrefix
tutaj robi.
1) Dlaczego nie mogę uzyskać dostępu localhost:8080/static
jeśli usunę http.StripPrefix
?
2) Jaki adres URL mapuje do folderu /static
, jeśli usunę tę funkcję?
3 answers
http.StripPrefix()
przekazuje obsługę żądania do tego, które określisz jako jego parametr, ale wcześniej modyfikuje adres URL żądania, usuwając określony prefiks.
/static/example.txt
StripPrefix
wytnie /static/
i przekaże zmodyfikowane żądanie do obsługi zwracanej przez http.FileServer()
więc zobaczy, że żądany zasób to
/example.txt
The Handler
returned by http.FileServer()
będzie szukał i podawał zawartość pliku względnego do folderu (a raczej FileSystem
) określonego jako jego parametr (określiłeś "static"
jako root plików statycznych).
Teraz, ponieważ "example.txt"
znajduje się w folderze static
, musisz określić względną ścieżkę do niego, aby uzyskać ścieżkę do pliku corrent.
Kolejny Przykład
Ten przykład można znaleźć na stronie dokumentacji pakietu http ( tutaj):
// 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"))))
Explanation:
FileServer()
mówi się, że głównym źródłem plików statycznych jest "/tmp"
. Chcemy, aby adres URL zaczynał się od "/tmpfiles/"
. Więc jeśli ktoś zażąda "/tempfiles/example.txt"
, chcemy, aby serwer wysłał plik "/tmp/example.txt"
.
"/tmpfiles"
z adresu URL, a pozostała ścieżka będzie ścieżką względną w porównaniu do folderu głównego "/tmp"
, który jeśli połączymy daje:
/tmp/example.txt
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-18 21:06:08
Załóżmy, że
Mam plik
/home/go/src/js/kor.js
Następnie powiedz fileserve serwuje lokalny katalog
fs := http.FileServer(http.Dir("/home/go/src/js"))
Przykład 1-root url do filerserver root
Teraz serwer plików przyjmuje "/"
żądanie jako "/home/go/src/js"+"/"
http.Handle("/", fs)
Tak, http://localhost/kor.js
Prośba informuje serwer plików, Znajdź kor.js
W
"/home/go/src/js" + "/" + "kor.js".
Mamy kor.js
Plik.
Przykład2-niestandardowy adres URL do katalogu głównego serwera plików
Ale, jeśli dodamy dodatkową nazwę resquest.
http.Handle("/static/", fs)
Teraz serwer plików bierze "/static/"
request as "/home/go/src/js"+"/static/"
Tak, http://localhost/static/kor.js
Prośba informuje serwer plików, Znajdź kor.js
W
"/home/go/src/js" + "/static/" + "kor.js".
Mamy błąd 404.
Przykład 3-niestandardowy adres URL do katalogu głównego serwera plików z
Modyfikujemy więc adres URL żądania, zanim serwer plików przyjmie go za pomocą http.StripPrefix("/tmpfiles/", ...
Po stripPrefix
Fileserver bierze /
zamiast /static/
"/home/go/src/js" + "/" + "kor.js".
Got kor.js
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-27 19:54:43
Odpowiem na dwa pytania jeden po drugim.
Odpowiedź 1 na pytanie 1: Jeśli twój kod jest napisany jak poniżej:
http.Handle("/static/", http.FileServer(http.Dir("static"))
Twoim katalogiem głównym jest %GOPATH%/src/project_name/static/
. Gdy uzyskasz dostęp do localhost:8080/static
, adres URL /static
zostanie przekazany do obsługi zwracanej przez http.FileServer () . Jednak nie masz katalogu ani pliku o nazwie static
w folderze głównym.
Odpowiedź 2 na pytanie 2: ogólnie rzecz biorąc, nie możesz uzyskać dostępu do folderu /static
, Jeśli usuniesz http.StripPrefix () . Jeśli jednak masz katalog lub plik o nazwie static
, możesz uzyskać do niego dostęp (, a nie Katalog główny) z adresem URL localhost:8080:/static
.
Przy okazji, nie możesz uzyskać dostępu do niczego, jeśli twój adres URL nie zaczyna się od /static
, ponieważ http.ServeMux
nie przekieruje twojego żądania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-26 21:44:34