package main import ( "log" "net/http" ) func main() { fs := http.FileServer(http.Dir(".")) http.Handle("/", fs) log.Println("Listening...") http.ListenAndServe(":3000", nil) }
所以我有一个index.html文件,并希望服务器停止显示它。
mv1qrgav1#
FileServer的文档指出:作为一种特殊情况,返回的文件服务器会将任何以“/index.html”结尾的请求重定向到相同的路径,而不包含最终的“index.html”。所以/index.html被重定向到/,/foo/bar/index.html被重定向到/foo/bar/。为了避免这种情况,请为特殊情况注册一个额外的处理程序。
/index.html
/
/foo/bar/index.html
/foo/bar/
http.HandleFunc("/index.html", func(w http.ResponseWriter, r *http.Request) { f, err := os.Open("index.html") if err != nil { // handle error return } http.ServeContent(w, r, "index.html", time.Now(), f) })
请注意,我使用ServeContent代替ServeFile,因为ServeFile处理/index.html请求的方式与FileServer相同。
ServeFile
FileServer
but5z9lq2#
没有重定向,请求目录时呈现的默认文件是index.html。目录列表是找不到此文件时的后备,因此如果不删除index.html文件,您将无法获得目录列表。如果你想要一个目录列表,你必须自己写出来,然后你可以选择任何格式和样式。如果你想直接写出来,基本结构非常简单,以内部dirList函数为例:
index.html
dirList
w.Header().Set("Content-Type", "text/html; charset=utf-8") fmt.Fprintf(w, "<pre>\n") for _, d := range dirs { name := d.Name() if d.IsDir() { name += "/" } url := url.URL{Path: name} fmt.Fprintf(w, "<a href=\"%s\">%s</a>\n", url.String(), htmlReplacer.Replace(name)) } fmt.Fprintf(w, "</pre>\n")
t5zmwmid3#
我认为有三种方法:1.创建一个PR,允许访问/index.html而不重定向到golang的net/http/fs库。https://github.com/golang/go/issues/538701.破解你的代码:将/index.html替换为/以停止301重定向,例如https://github.com/ahuigo/go-lib/commit/1a99191d5c01cf9025136ce8ddb9668f123de05c#diff-67e8621fbb99281a50c089bae53d4874663d3d21ca5e90809ec207c070029351R441.自定义您自己的http fs处理程序而不是官方工具。
twh00eeo4#
假设你有一个“images”目录来存放你的图片,像这样:
http.Handle("/images/", http.StripPrefix("/images/", http.FileServer(http.Dir("images"))))
但是你不想暴露所有的文件名,就像人们说的,“沉默是金”。在浏览器中,默认情况下,转到/images或/images/或/images/index.html会显示所有文件的列表,这真的不是你想意外地做的事情。我认为最简单的命令行解决方案:
/images
/images/
/images/index.html
touch index.html
这将创建一个空文件,阻止自动生成的images/index.html目录列表。并且这不会阻止对其中任何图像的访问。当然,黑客仍然可以尝试暴力猜测其中的文件,因此您需要使用一些常识。
4条答案
按热度按时间mv1qrgav1#
FileServer的文档指出:
作为一种特殊情况,返回的文件服务器会将任何以“/index.html”结尾的请求重定向到相同的路径,而不包含最终的“index.html”。
所以
/index.html
被重定向到/
,/foo/bar/index.html
被重定向到/foo/bar/
。为了避免这种情况,请为特殊情况注册一个额外的处理程序。
请注意,我使用ServeContent代替ServeFile,因为
ServeFile
处理/index.html
请求的方式与FileServer
相同。but5z9lq2#
没有重定向,请求目录时呈现的默认文件是
index.html
。目录列表是找不到此文件时的后备,因此如果不删除index.html
文件,您将无法获得目录列表。如果你想要一个目录列表,你必须自己写出来,然后你可以选择任何格式和样式。如果你想直接写出来,基本结构非常简单,以内部
dirList
函数为例:t5zmwmid3#
我认为有三种方法:
1.创建一个PR,允许访问
/index.html
而不重定向到golang的net/http/fs库。https://github.com/golang/go/issues/538701.破解你的代码:将
/index.html
替换为/
以停止301重定向,例如https://github.com/ahuigo/go-lib/commit/1a99191d5c01cf9025136ce8ddb9668f123de05c#diff-67e8621fbb99281a50c089bae53d4874663d3d21ca5e90809ec207c070029351R441.自定义您自己的http fs处理程序而不是官方工具。
twh00eeo4#
假设你有一个“images”目录来存放你的图片,像这样:
但是你不想暴露所有的文件名,就像人们说的,“沉默是金”。
在浏览器中,默认情况下,转到
/images
或/images/
或/images/index.html
会显示所有文件的列表,这真的不是你想意外地做的事情。我认为最简单的命令行解决方案:
这将创建一个空文件,阻止自动生成的images/index.html目录列表。并且这不会阻止对其中任何图像的访问。当然,黑客仍然可以尝试暴力猜测其中的文件,因此您需要使用一些常识。