重定向静态文件请求

我正在尝试提供一个静态 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按照以下建议使用后。我究竟做错了什么?


胡说叔叔
浏览 177回答 2
2回答

慕后森

在您的 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)

阿波罗的战车

所以,我知道这是一个有点混乱,但你想改变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 重写。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go