使用GoLang Webserver提供静态内容

时间:2017-05-12 17:04:08

标签: go

我正在探索Go的深度,并且我一直在尝试编写一个简单的Web应用程序来包围我的所有内容。我试图提供React.js应用程序。

以下是Go服务器的代码。我已经获得/服务index.html的默认路由,该路由正常。我很难将静态文件提供给该索引文件。我允许React App自己进行客户端路由,但我需要静态地提供JavaScript / CSS / Media文件。

例如,我需要能够将bundle.js文件提供给index.html,以便运行React应用程序。目前,当我路由到localhost:8000/dist/时,我看到列出的文件,但是我从那里点击的每个文件/文件夹都抛出404 Page Not Found。有什么东西我不见了吗?推动正确的方向将非常受欢迎。

Webserver.go

package main

import (
    "net/http"
    "log"
    "fmt"
    "os"

    "github.com/BurntSushi/toml"
    "github.com/gorilla/mux"
)

type ServerConfig struct {
    Environment string
    Host string
    HttpPort int
    HttpsPort int
    ServerRoot string
    StaticDirectories []string
}

func ConfigureServer () ServerConfig {
    _, err := os.Stat("env.toml")
    if err != nil {
        log.Fatal("Config file is missing: env.toml")
    }

    var config ServerConfig
    if _, err := toml.DecodeFile("env.toml", &config); err != nil {
        log.Fatal(err)
    }

    return config
}

func IndexHandler (w http.ResponseWriter, r *http.Request) {
    http.ServeFile(w, r, "./src/index.html")
}

func main () {
    Config := ConfigureServer()
    router := mux.NewRouter()

    // Configuring static content to be served.
    router.Handle("/dist/", http.StripPrefix("/dist/", http.FileServer(http.Dir("dist"))))

    // Routing to the Client-Side Application.
    router.HandleFunc("/", IndexHandler).Methods("GET")

    log.Printf(fmt.Sprintf("Starting HTTP Server on Host %s:%d.", Config.Host, Config.HttpPort))

    if err := http.ListenAndServe(fmt.Sprintf("%s:%d", Config.Host, Config.HttpPort), router); err != nil {
        log.Fatal(err)
    }
}

2 个答案:

答案 0 :(得分:2)

根据gorilla mux docs,执行此操作的正确方法是使用PathPrefix注册的处理程序,如下所示:

router.PathPrefix("/dist/").Handler(http.StripPrefix("/dist/", http.FileServer(http.Dir("dist"))))

如果您在文档中搜索PathPrefix("/static/")等内容,则可以找到一个示例。

这种通配符行为实际上是默认使用net / http中的模式匹配机制,所以如果你没有使用gorilla,只是默认的net / http,你可以执行以下操作:

http.Handle("/dist/", http.StripPrefix("/dist/", http.FileServer(http.Dir("dist"))))

答案 1 :(得分:0)

文件访问路径可能存在问题。尝试:

// Strip away "/dist" instead of "/dist/"
router.Handle("/dist/", http.StripPrefix("/dist", http.FileServer(http.Dir("dist"))))