Обслуживание статического контента с корневым URL-адресом с помощью Gorilla toolkit
Я пытаюсь использовать инструментарий гориллы mux
пакета для маршрутизации URL-адресов на веб-сервере Go. Используя этот вопрос в качестве руководства у меня есть следующий код перейти:
func main() {
r := mux.NewRouter()
r.Handle("/", http.FileServer(http.Dir("./static/")))
r.HandleFunc("/search/{searchTerm}", Search)
r.HandleFunc("/load/{dataId}", Load)
http.Handle("/", r)
http.ListenAndServe(":8100", nil)
}
структура каталогов:
...
main.go
static
| index.html
| js
| <js files>
| css
| <css files>
на файлы Javascript и CSS ссылаются в index.html
такой:
...
<link rel="stylesheet" href="css/redmond/jquery-ui.min.css"/>
<script src="js/jquery.min.js"></script>
...
когда я получаю доступ http://localhost:8100
в моем веб-браузере index.html
содержание поставлено успешно, однако, все js
и css
URLs возвращают 404s.
как я могу получить программу для обслуживания файлов из static
поддиректории?
5 ответов
Я думаю, что вы, возможно, ищете PathPrefix
...
func main() {
r := mux.NewRouter()
r.HandleFunc("/search/{searchTerm}", Search)
r.HandleFunc("/load/{dataId}", Load)
r.PathPrefix("/").Handler(http.FileServer(http.Dir("./static/")))
http.ListenAndServe(":8100", r)
}
после многих проб и ошибок, оба вышеуказанных ответа помогли мне придумать, что сработало для меня. У меня есть статическая папка в корневом каталоге веб-приложения.
вместе с PathPrefix
мне пришлось использовать StripPrefix
для получения маршрута для рекурсивной работы.
package main
import (
"log"
"net/http"
"github.com/gorilla/mux"
)
func main() {
r := mux.NewRouter()
s := http.StripPrefix("/static/", http.FileServer(http.Dir("./static/")))
r.PathPrefix("/static/").Handler(s)
http.Handle("/", r)
err := http.ListenAndServe(":8081", nil)
}
Я надеюсь, что это поможет кому-то еще с проблемами.
У меня есть этот код, который работает довольно хорошо и повторно используется.
func ServeStatic(router *mux.Router, staticDirectory string) {
staticPaths := map[string]string{
"styles": staticDirectory + "/styles/",
"bower_components": staticDirectory + "/bower_components/",
"images": staticDirectory + "/images/",
"scripts": staticDirectory + "/scripts/",
}
for pathName, pathValue := range staticPaths {
pathPrefix := "/" + pathName + "/"
router.PathPrefix(pathPrefix).Handler(http.StripPrefix(pathPrefix,
http.FileServer(http.Dir(pathValue))))
}
}
router := mux.NewRouter()
ServeStatic(router, "/static/")
попробуйте это:
fileHandler := http.StripPrefix("/static/", http.FileServer(http.Dir("/absolute/path/static")))
http.Handle("/static/", fileHandler)
это обслуживает все файлы внутри флага папки, а также индекс обслуживания.html в корне.
использование
//port default values is 8500
//folder defaults to the current directory
go run main.go
//your case, dont forget the last slash
go run main.go -folder static/
//dont
go run main.go -folder ./
код
package main
import (
"flag"
"fmt"
"net/http"
"os"
"strconv"
"strings"
"github.com/gorilla/handlers"
"github.com/gorilla/mux"
"github.com/kr/fs"
)
func main() {
mux := mux.NewRouter()
var port int
var folder string
flag.IntVar(&port, "port", 8500, "help message for port")
flag.StringVar(&folder, "folder", "", "help message for folder")
flag.Parse()
walker := fs.Walk("./" + folder)
for walker.Step() {
var www string
if err := walker.Err(); err != nil {
fmt.Fprintln(os.Stderr, "eroooooo")
continue
}
www = walker.Path()
if info, err := os.Stat(www); err == nil && !info.IsDir() {
mux.HandleFunc("/"+strings.Replace(www, folder, "", -1), func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, www)
})
}
}
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, folder+"index.html")
})
http.ListenAndServe(":"+strconv.Itoa(port), handlers.LoggingHandler(os.Stdout, mux))
}