我尝试提供静态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标记。
这是怎么回事?
当我浏览libs.js
请求的结果时,我看到了html标记。即使在使用下面建议的StripPrefix
之后也是如此。我做错了什么?
答案 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)