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)如果删除该功能,哪个URL映射到/static
文件夹?
答案 0 :(得分:34)
http.StripPrefix()
将请求的处理转发给您指定为其参数的请求,但在此之前,它会通过剥离指定的前缀来修改请求URL。
例如,在您的情况下,如果浏览器(或HTTP客户端)请求资源:
/static/example.txt
StripPrefix
会删除/static/
并将修改后的请求转发给http.FileServer()
返回的处理程序,这样就会看到所请求的资源是
/example.txt
Handler
返回的http.FileServer()
将查找并提供文件 relative 的内容到指定为其参数的文件夹(或更确切地说FileSystem
) (您指定"static"
为静态文件的根目录。)
既然"example.txt"
位于static
文件夹中,您必须指定相对路径以获取相关文件路径。
此示例可在http包文档页面(here)上找到:
// 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"
。我们希望网址以"/tmpfiles/"
开头。因此,如果有人请求"/tempfiles/example.txt"
,我们希望服务器发送文件"/tmp/example.txt"
。
为了实现这一目标,我们必须从网址中删除"/tmpfiles"
,其余的将是与根文件夹"/tmp"
相比的相对路径,如果我们加入,则为:
/tmp/example.txt
答案 1 :(得分:3)
我有一个文件
/home/go/src/js/kor.js
然后,告诉fileserve提供本地目录
fs := http.FileServer(http.Dir("/home/go/src/js"))
现在,文件服务器将"/"
请求作为"/home/go/src/js"+"/"
http.Handle("/", fs)
是的,http://localhost/kor.js
请求告诉Fileserver,在
kor.js
"/home/go/src/js" + "/" + "kor.js".
我们收到了kor.js
个文件。
但是,如果我们添加额外的resquest名称。
http.Handle("/static/", fs)
现在,文件服务器将"/static/"
请求作为"/home/go/src/js"+"/static/"
是的,http://localhost/static/kor.js
请求告诉Fileserver,在
kor.js
"/home/go/src/js" + "/static/" + "kor.js".
我们收到404错误。
因此,我们在Fileserver使用http.StripPrefix("/tmpfiles/", ...
stripPrefix
文件服务器取代/
而不是/static/
"/home/go/src/js" + "/" + "kor.js".
得到kor.js
答案 2 :(得分:1)
我将逐一回答这两个问题。
回答第1个问题: 如果您的代码编写如下:
http.Handle("/static/", http.FileServer(http.Dir("static"))
您的根文件夹是%GOPATH%/src/project_name/static/
。当您访问localhost:8080/static
时,网址/static
将转发给http.FileServer()返回的处理程序。但是,根文件夹中没有名为static
的目录或文件。
对问题2的回答2 :一般情况下,如果删除http.StripPrefix(),则无法访问/static
文件夹。但是,如果您有一个名为static
的目录或文件,则可以使用URL localhost:8080:/static
访问它(不是您想要的根目录)。
顺便说一下,如果您的网址不以/static
开头,则无法访问任何内容,因为http.ServeMux
不会重定向您的请求。
答案 3 :(得分:0)
对于子目录有问题的任何人,您都需要添加一个"."
,因为似乎只有在二进制目录的根目录中有一个文件夹时,它才会将路径视为相对路径。
例如
s.router.PathPrefix("/logos/").Handler(
http.StripPrefix("/logos/", http.FileServer(http.Dir("./uploads/logos/"))))
请注意在"."
之前的/uploads