web-dev-qa-db-ja.com

Gorillaツールキットを使用してルートURLで静的コンテンツを提供する

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サブディレクトリからファイルを提供するプログラムを取得するにはどうすればよいですか?

53
jason

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)
}
78
Chris Farmiloe

多くの試行錯誤の後、上記の両方の答えは、私にとってうまくいったことを考え出すのに役立ちました。 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)
}

他の誰かが問題を抱えているのを助けることを願っています。

40
codefreak

ここにこのコードがありますが、これは非常にうまく機能し、再利用可能です。

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/")
9
Thomas Modeneis

これを試して:

fileHandler := http.StripPrefix("/static/", http.FileServer(http.Dir("/absolute/path/static")))
http.Handle("/static/", fileHandler)
4
Joe