Gorillaツールキットの mux
package を使用してGo Webサーバーで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>
...
Webブラウザーでhttp://localhost:8100
にアクセスすると、index.html
コンテンツは正常に配信されますが、js
およびcss
URLはすべて404を返します。
static
サブディレクトリからファイルを提供するプログラムを取得するにはどうすればよいですか?
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)
}
多くの試行錯誤の後、上記の両方の答えは、私にとってうまくいったことを考え出すのに役立ちました。 Webアプリのルートディレクトリに静的フォルダーがあります。
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)