为了账号安全,请及时绑定邮箱和手机立即绑定

重定向静态文件请求

重定向静态文件请求

Go
胡说叔叔 2021-12-27 17:04:55
我正在尝试提供一个静态 html 文件,该文件具有指向其他资源的脚本标记。我想从一个目录提供 html 文件,然后将资产请求重定向到另一个目录。这就是我现在设置的方式:// server.goimport (    "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 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

在您的 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,你可以使用StripPrefixassets从服务器中的 url 中取出部分。


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

http.Handle("/assets/", fs)


查看完整回答
反对 回复 2021-12-27
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

所以,我知道这是一个有点混乱,但你想改变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 重写。


查看完整回答
反对 回复 2021-12-27
  • 2 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信