golang静态停止index.html重定向

bxjv4tth  于 2023-04-27  发布在  Go
关注(0)|答案(4)|浏览(270)
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文件,并希望服务器停止显示它。

mv1qrgav

mv1qrgav1#

FileServer的文档指出:
作为一种特殊情况,返回的文件服务器会将任何以“/index.html”结尾的请求重定向到相同的路径,而不包含最终的“index.html”。
所以/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相同。

but5z9lq

but5z9lq2#

没有重定向,请求目录时呈现的默认文件是index.html。目录列表是找不到此文件时的后备,因此如果不删除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")
t5zmwmid

t5zmwmid3#

我认为有三种方法:
1.创建一个PR,允许访问/index.html而不重定向到golang的net/http/fs库。https://github.com/golang/go/issues/53870
1.破解你的代码:将/index.html替换为/以停止301重定向,例如https://github.com/ahuigo/go-lib/commit/1a99191d5c01cf9025136ce8ddb9668f123de05c#diff-67e8621fbb99281a50c089bae53d4874663d3d21ca5e90809ec207c070029351R44
1.自定义您自己的http fs处理程序而不是官方工具。

twh00eeo

twh00eeo4#

假设你有一个“images”目录来存放你的图片,像这样:

http.Handle("/images/", http.StripPrefix("/images/", http.FileServer(http.Dir("images"))))

但是你不想暴露所有的文件名,就像人们说的,“沉默是金”。
在浏览器中,默认情况下,转到/images/images//images/index.html会显示所有文件的列表,这真的不是你想意外地做的事情。
我认为最简单的命令行解决方案:

touch index.html

这将创建一个空文件,阻止自动生成的images/index.html目录列表。并且这不会阻止对其中任何图像的访问。当然,黑客仍然可以尝试暴力猜测其中的文件,因此您需要使用一些常识。

相关问题