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

为什么我需要使用 http.StripPrefix 来访问我的静态文件?

为什么我需要使用 http.StripPrefix 来访问我的静态文件?

Go
万千封印 2021-09-10 21:06:04
main.gopackage mainimport (    "net/http")func main() {    http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))    http.ListenAndServe(":8080", nil)}目录结构:%GOPATH%/src/project_name/main.go%GOPATH%/src/project_name/static/..files and folders ..即使在阅读了文档之后,我也无法理解http.StripPrefix这里到底做了什么。1)为什么localhost:8080/static我删除了就不能访问http.StripPrefix?2)/static如果我删除该功能,什么 URL 映射到文件夹?
查看完整描述

3 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

http.StripPrefix() 将请求的处理转发给您指定为参数的请求,但在此之前它会通过去除指定的前缀来修改请求 URL。


因此,例如在您的情况下,如果浏览器(或 HTTP 客户端)请求资源:


/static/example.txt

StripPrefix将剪切/static/并将修改后的请求转发给返回的处理程序,http.FileServer()因此它会看到请求的资源是


/example.txt

在Handler通过返回http.FileServer()将寻找并送达文件的内容相对文件夹(或者更确切地说,FileSystem指定作为其参数)(指定"static"为静态文件的根目录)。


现在因为"example.txt"在static文件夹中,您必须指定一个相对路径才能获得正确的文件路径。


另一个例子

这个例子可以在 http 包文档页面(这里)上找到:


// To serve a directory on disk (/tmp) under an alternate URL

// path (/tmpfiles/), use StripPrefix to modify the request

// URL's path before the FileServer sees it:

http.Handle("/tmpfiles/",

        http.StripPrefix("/tmpfiles/", http.FileServer(http.Dir("/tmp"))))

解释:


FileServer()被告知静态文件的根是"/tmp". 我们希望 URL 以"/tmpfiles/". 因此,如果有人请求"/tempfiles/example.txt",我们希望服务器发送文件"/tmp/example.txt"。


为了实现这一点,我们必须"/tmpfiles"从 URL 中剥离,剩下的将是与根文件夹相比的相对路径"/tmp",如果我们加入,则给出:


/tmp/example.txt


查看完整回答
反对 回复 2021-09-10
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

假使,假设

我有一个文件

/home/go/src/js/kor.js

然后,告诉 fileserve 服务本地目录

fs := http.FileServer(http.Dir("/home/go/src/js"))

示例 1 - 到 Filerserver 根的根 url

现在文件服务器将"/"请求作为"/home/go/src/js"+"/"

http.Handle("/", fs)

是的,http://localhost/kor.js请求告诉文件服务器,kor.js

"/home/go/src/js" +  "/"  + "kor.js".

我们得到了kor.js文件。

示例 2 - 文件服务器根目录的自定义 url

但是,如果我们添加额外的请求名称。

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

现在文件服务器将"/static/"请求作为"/home/go/src/js"+"/static/"

是的,http://localhost/static/kor.js请求告诉文件服务器,kor.js

"/home/go/src/js" +  "/static/"  + "kor.js".

我们收到了 404 错误。

示例 3 - 自定义 url 到文件服务器根目录

所以,我们在 Fileserver 获取它之前修改请求 url http.StripPrefix("/tmpfiles/", ...

之后stripPrefix文件服务器承担/,而不是/static/

"/home/go/src/js" +  "/"  + "kor.js".

得到了 kor.js


查看完整回答
反对 回复 2021-09-10
?
慕容3067478

TA贡献1773条经验 获得超3个赞

我将一一回答这两个问题。

问题 1 的答案 1: 如果您的代码如下所示:

http.Handle("/static/", http.FileServer(http.Dir("static"))

你的根文件夹是%GOPATH%/src/project_name/static/. 当您访问 时localhost:8080/static,URL/static将被转发到由http.FileServer()返回的处理程序。但是,static根文件夹中没有命名的目录或文件。

问题 2 的答案 2:通常,/static如果删除http.StripPrefix(),则无法访问文件夹。但是,如果您有一个名为 的目录或文件static,则可以使用URL访问它(完全不是您想要的根目录localhost:8080:/static

顺便说一句,如果您的 URL 不以 开头,您将无法访问任何内容/static,因为http.ServeMux不会重定向您的请求。


查看完整回答
反对 回复 2021-09-10
  • 3 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

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