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ę?

Author: eduncan911, 2015-01-14

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.

Na przykład w przypadku, gdy przeglądarka (lub klient HTTP) zażąda zasobu:]}
/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".

Aby to osiągnąć, musimy usunąć "/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
 26
Author: icza,
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

 2
Author: Youngsoo Yi,
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.

 1
Author: seafooler,
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