一尘不染

使用GoLang Web服务器提供静态内容

go

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

下面是Go服务器的代码。我有默认的/服务路线,效果index.html很好。我正在努力允许将静态文件提供给该索引文件。尽管我需要静态提供JavaScript
/ CSS / Media文件,但我允许React App自己进行客户端路由。

例如,我需要能够将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)
    }
}

阅读 183

收藏
2020-07-02

共1个答案

一尘不染

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

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

如果您在文档中搜索类似之类的内容,则会找到一个示例PathPrefix("/static/")


缺省情况下,这种通配符行为实际上是通过net / http中的模式匹配机制来实现的,因此,如果您不使用大猩猩,而仅使用默认的net /
http,则可以执行以下操作:

http.Handle("/dist/", http.StripPrefix("/dist/", http.FileServer(http.Dir("dist"))))
2020-07-02