2013-03-19 13 views
6

Nie rozumiem, dlaczego moje statyczne zasoby nie są podawane. Oto kod:Go: http statyczne katalogi nie są podawane

func main() { 
    http.HandleFunc("/", get_shows) 
    http.HandleFunc("/get", get_show_json) 
    http.HandleFunc("/set", set_shows) 
    http.Handle("/css/", http.FileServer(http.Dir("./css"))) 
    http.Handle("/js/", http.FileServer(http.Dir("./js"))) 
    http.ListenAndServe(":8080", nil) 
} 

Kiedy uruchamiam program, przechodząc do http://myhost.fake/css/ lub http://myhost.fake/css/main.css (te istnieje w systemie plików), pojawia się błąd 404. To samo dotyczy zmiany "./css" na pełną ścieżkę do katalogu. Ditto dla statycznego katalogu js. Moi pozostali opiekunowie działają dobrze. Jestem na Linuksie. Dzięki!

+0

Dlaczego ta zaszufladkowany "Linux"? Jak mogę ustawić "Go" jako główną kategorię pytania? – Jeremy

+2

Myślę, że może teraz szuka '/ full/path/to/css/css /'. Spróbuj podać 'http.Dir()' katalog nadrzędny katalogów 'js' i' css'. –

+3

@ System, masz rację. Nie jest to jednak dla mnie wcale oczywiste z dokumentacji. – Jeremy

Odpowiedz

12

Twoja ścieżka obsługi (/css/) jest przekazywany do obsługi fileserver plus plik po prefiksie. Oznacza to, że podczas odwiedzania strony http://myhost.fake/css/test.css serwer plików próbuje znaleźć plik ./css/css/test.css.

Pakiet http udostępnia funkcję StripPrefix, która usuwa prefiks /css/.

ten powinien zrobić:

http.Handle("/css/", http.StripPrefix("/css/", http.FileServer(http.Dir("css")))) 
+1

Dzięki Obecnie używam 'http... uchwyt („/ css /”, http.FileServer (http.Dir („”))) ', która działa zgodnie z oczekiwaniami. – Jeremy

+2

także pamiętać, że względna ścieżka zostanie rozwiązany w stosunku do katalogu, z którego serwer uruchamiany jest statyczny plik wykonywalny (nie dotyczy tego pliku binarnego). Aby debugować problem, znalazłem przydatne wrzucenie do niego 'log.Printf (os.Getwd())' lub wyświetlenie tych plików. – dghubble

0

nie mogę zweryfikować to teraz, ale IIRC: s/"./css"/"css"/; s/"./js"/"js"/.

EDIT: Teraz mogę wreszcie sprawdzić źródeł: To jest to, co zrobiłem i co działa dla mnie:

http.Handle("/scripts/", http.FileServer(http.Dir(""))) 
http.Handle("/images/", http.FileServer(http.Dir(""))) 

Wszystkie obrazy w ./images/*.{gif,png,...} się prawidłowo doręczone. Ta sama historia o skryptach.

+0

To nie wydaje się być problemem. – Jeremy

+0

Cholerny !. Rozwiązałem dokładnie ten sam problem kilka dni temu i nie mogę sobie przypomnieć poprawną odpowiedź :-( – zzzz

+0

@Jeremy: Tylko dla odniesienia, mam zaktualizowane odpowiedź roztworu roboczego – zzzz

Powiązane problemy