为什么我需要使用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)如果我删除该function,什么URL映射到/static
文件夹?
http.StripPrefix()
将请求处理转发给您指定的参数,但在此之前,通过剥离指定的前缀来修改请求URL。
所以例如在你的情况下,如果浏览器(或HTTP客户端)请求资源:
/static/example.txt
StripPrefix
将剪切/static/
并将修改后的请求转发给http.FileServer()
返回的处理程序,以便看到请求的资源是
/example.txt
http.FileServer()
返回的Handler
会查找并提供指定为其参数(指定"static"
为静态文件根目录)的文件夹(或FileSystem
)的文件内容。
现在,由于"example.txt"
位于static
文件夹中,因此必须指定相对path来获取corrent文件path。
另一个例子
这个例子可以在http包的文档页面( 这里 )find:
// 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"
。
为了达到这个目的,我们必须从URL中"/tmpfiles"
,剩下的就是相对于根文件夹"/tmp"
的相对path,如果我们join的话:
/tmp/example.txt
我会一一回答这两个问题。
问题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 :通常,如果删除http.StripPrefix() ,则无法访问/static
文件夹。 但是,如果您有一个名为static
的目录或文件,则可以使用URL localhost:8080:/static
来访问它( 完全不是您想要的根目录 )。
顺便说一下,如果你的URL不是以/static
开头的,你不能访问任何东西,因为http.ServeMux
不会redirect你的请求。