重定向对静态文件的请求
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)
我正在尝试提供一个静态 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)