重定向对静态文件的请求

Redirect requests for static files

我正在尝试提供一个静态 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 之后。我做错了什么?

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

原因是 "assets" 的路径已经在请求中指定,所以你有它,它实际上指向 ../../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 重写文件系统服务。

在您的 html 中,当您指定 css 和 js 的 src 属性时,您有 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)