我正在探索Go的深度,并且我一直在尝试编写一个简单的Web应用程序来围绕所有内容。我正在尝试服务React.js应用程序。
下面是Go服务器的代码。我有默认的/服务路线,效果index.html很好。我正在努力允许将静态文件提供给该索引文件。尽管我需要静态提供JavaScript / CSS / Media文件,但我允许React App自己进行客户端路由。
/
index.html
例如,我需要能够将bundle.js文件index.html提供给React应用程序才能运行。目前,当我转到时,localhost:8000/dist/我看到文件正在列出,但是我从那里单击的每个文件/文件夹都抛出一个404 Page Not Found。有什么我想念的吗?向正确方向的推动将不胜感激。
bundle.js
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) } }
根据大猩猩mux docs,执行此操作的正确方法是在上注册的处理程序PathPrefix,如下所示:
PathPrefix
router.PathPrefix("/dist/").Handler(http.StripPrefix("/dist/", http.FileServer(http.Dir("dist"))))
如果您在文档中搜索类似之类的内容,则会找到一个示例PathPrefix("/static/")。
PathPrefix("/static/")
缺省情况下,这种通配符行为实际上是通过net / http中的模式匹配机制来实现的,因此,如果您不使用大猩猩,而仅使用默认的net / http,则可以执行以下操作:
http.Handle("/dist/", http.StripPrefix("/dist/", http.FileServer(http.Dir("dist"))))