让服务器无法正常提供文件

时间:2015-12-18 00:40:00

标签: http web go webserver localhost

我正在创建一个SPA。 我试图用index.html响应所有请求 (我在前端处理路由)。

我的目录结构如下所示:

后端

- main.go

前端

..(其他一些文件)..

- index.html

整个项目位于“C:\ Go \ Projects \ src \ github.com \ congrady \ Bakalarka”

我的main.go文件如下所示:

package main

import (
    "net/http"
)

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

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

当我运行我的main.go文件(使用go run)时,我的localhost总是响应“找不到404页面”。 当我尝试使用fmt提供静态内容时,一切正常。

请帮助,我坚持了很长时间,我无法让它工作。 感谢

2 个答案:

答案 0 :(得分:0)

请注意,如果您对源文件中的相对路径进行硬编码,则启动应用程序时所在的目录很重要。

在当前配置中,确保从Backend目录启动应用程序,即

C:\转到\项目\ SRC \ github.com \ congrady \ Bakalarka \后端

您的应用根目录

C:\转到\项目\ SRC \ github.com \ congrady \ Bakalarka

将主文件中的字符串更改为 Frontend / index.html 并从

运行

C:\转到\项目\ SRC \ github.com \ congrady \ Bakalarka

答案 1 :(得分:-1)

使用io/ioutil包打开HTML文件。示例是index, _ := ioutil.ReadFile("index.html")。然后写回复w.Write(index)

如果要成为动态模板,请使用text/template包进行解析。请参见示例here

注意 http.ServeFile仅用于提供.css.js文件等静态资源。

总而言之,这是一个简单的例子。

package main

import (
    "io/ioutil"
    "net/http"
    "text/template"
)

func main() {
    http.HandleFunc("/", rootHandler)
    http.HandleFunc("/Frontend/", staticHandler)
    http.ListenAndServe(":8080", nil)
}

func staticHandler(res http.ResponseWriter, req *http.Request) {
    http.ServeFile(res, req, ".."+req.URL.Path[:]) // <link rel=stylesheet href="/Frontend/style.css">
}

func rootHandler(res http.ResponseWriter, req *http.Request) {
    index, _ := ioutil.ReadFile("../Frontend/index.html")

    t := template.New("")
    t, _ = t.Parse(string(index))

    t.Execute(res, nil)
}