我正在探索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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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)
    }
}
  • 希望精通大猩猩的人能回答您的问题。 您有理由使用大猩猩复用器吗? 似乎stdlib mux可以很好地处理此问题。
  • 我不认为这是造成问题的图书馆。 香港专业教育学院尝试删除大猩猩和我得到相同的问题。 大猩猩的理由是稍后再了解API和Auth服务的全部内容。

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

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

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

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

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

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

1
2
// Strip away"/dist" instead of"/dist/"
router.Handle("/dist/", http.StripPrefix("/dist", http.FileServer(http.Dir("dist"))))
  • 仍然不起作用。 浏览器中的URL或cURL为http:localhost:8000distfilename.js。 我会做一些记录以确保请求和文件名。
  • 如果句柄URL与StripPrefix相同,则一旦您尝试访问文件,它将从URL中删除dist