猿问

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

main.go


package main


import (

    "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 映射到文件夹?


万千封印
浏览 171回答 3
3回答

慕姐4208626

http.StripPrefix() 将请求的处理转发给您指定为参数的请求,但在此之前它会通过去除指定的前缀来修改请求 URL。因此,例如在您的情况下,如果浏览器(或 HTTP 客户端)请求资源:/static/example.txtStripPrefix将剪切/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

慕尼黑5688855

假使,假设我有一个文件/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

慕容3067478

我将一一回答这两个问题。问题 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不会重定向您的请求。
随时随地看视频慕课网APP

相关分类

Go
我要回答