重定向静态文件的请求

时间:2016-03-25 22:24:34

标签: http go go-templates

我尝试提供静态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之后也是如此。我做错了什么?

2 个答案:

答案 0 :(得分:0)

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

原因是&#34;资产&#34;已经在请求中指定,所以你拥有它,它实际上指向../../ 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重写。

答案 1 :(得分:0)

在您的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从服务器的网址中取出assets部分。

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