我正在探索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)
}
}
答案 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"))))