0

我正在尝试提供静态 html 文件,并且该文件具有指向其他资源的脚本标记。我想从一个目录提供 html 文件,然后将资产请求重定向到另一个目录。这就是我现在的设置方式:

// server.go
import (
    "fmt"
    "html/template"
    "log"
    "net/http"
    "path"
    "time"
)

func handle(w http.ResponseWriter, r *http.Request) {
    lp := path.Join("./", "index.html")
    fmt.Println(lp)
    tmpl, err := template.ParseFiles(lp)
    if err != nil {
        log.Fatal(err)
    }
    tmpl.ExecuteTemplate(w, "index", nil)
}

func main() {
    fs := http.FileServer(http.Dir("../../app_assets/"))
    http.Handle("/assets", fs)
    http.HandleFunc("/static/", handle)

    fmt.Println("Go Server listening on port 8000")
    http.ListenAndServe(":8000", nil)
}

这是我的模板:

<!-- index.html -->
{{define "index"}}
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="assets/css/libs.css" type="text/css" />
</head>

<body>
<script type="text/javascript" src="assets/js/libs.js"></script>

<h1> Hello </h1>
</body>
</html>
{{end}}

我可以从 中提供索引文件localhost:8000/static/,但资产请求不会转到上两级的资产文件夹 ( ../../)。我究竟做错了什么?

笔记:

加载 libs.js 时,我在控制台中收到此错误:

Uncaught SyntaxError: Unexpected token <

这使我相信对libs.js文件的请求被重定向到 html 标记。

这是怎么回事?

笔记2:

当我浏览请求的结果时libs.js,我看到了 html 标记。即使StripPrefix按照以下建议使用后。我究竟做错了什么?

4

2 回答 2

0

所以我知道这有点令人困惑,但你想改变fs := http.FileServer(http.Dir("../../assets/"))fs := http.FileServer(http.Dir("../.."))

原因是“资产”的路径已经在请求中指定,所以你有它,它真的指向 ../../assets/assets/*

希望有帮助!

哦,为了防止另一个错误,Handle() 函数应该在路径中用斜杠编写。我差点忘了抓住那个。

编辑

要根据您的其他需求(使用某种重定向)调整我的答案,您必须使用http.StripPrefix处理程序https://golang.org/pkg/net/http/#StripPrefix

对于您的用例,您将使用以下代码准备服务器:

fs := http.FileServer(http.Dir("../../app_assets"))
http.Handle("/assets/", http.StripPrefix("/assets/", fs))

这使您可以为文件系统服务进行 url 重写。

于 2016-03-25T23:13:24.397 回答
0

在您的 html 中,当您指定srccss 和 js 的属性时,您拥有src="assets/js/libs.js". 这使得这些文件相对于当前路径被请求。所以请求转到http://localhost:8000/static/assets/js/libs.js.

由于它具有/static前缀,它将由您的/static处理程序处理,因此提供 html 文件。

要使其转到/assets处理程序,请指定src带有/前缀的 。

<script type="text/javascript" src="/assets/js/libs.js"></script>

现在服务器将在../../app_assets/assets/js/libs.js.

如果你想要它../../app_assets/js/libs.js,你可以使用StripPrefix从服务器中的 url 中取出assets部分。

fs := http.StripPrefix("/assets/", http.FileServer(http.Dir("../../app_assets/")))
http.Handle("/assets/", fs)
于 2016-03-26T04:47:01.997 回答