英文:
Golang Static folder path returns all files
问题
我有一个用于打开静态文件夹的代码:
fs := http.FileServer(http.Dir("./static/"))
router.PathPrefix("/static/").Handler(http.StripPrefix("/static/", fs))
但是当我访问/static路径时,它返回了该文件夹中的文件列表,例如:
license.txt
logo.png
但我想返回一个空白页面。
英文:
i have a this code to open static folder
fs := http.FileServer(http.Dir("./static/"))
router.PathPrefix("/static/").Handler(http.StripPrefix("/static/", fs))
but when i'm going to /static path it returns a list of files in this folder
eg
license.txt
logo.png
but i want to return a blank page
答案1
得分: 1
你可以在目录./static/中添加一个空白的index.html文件,它将被渲染为空白页面。
类似于这样:
<html>
<head><title>这里什么都没有</title></head>
<body><h1>这里什么都没有</h1></body>
</html>
英文:
You can add blank index.html in directory ./static/, it will be rendered as blank page.
Something like this
<html>
<head><title>Nothing here</title></head>
<body><h1>Nothing here</h1></body>
</html>
</details>
# 答案2
**得分**: 0
vodolaz095的答案是最简单的,但如果你真的必须在Go中完成,你可以包装`FileServer`来捕获请求根目录的特定情况:
```go
func noIndex(fs http.Handler) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        if r.URL.Path == "" || strings.HasSuffix(r.URL.Path, "/") {
            w.Write("")
            return
        }
        fs.ServeHTTP(w, r)
    }
}
请注意,这不会捕获URL中没有尾部斜杠的子目录的请求;要捕获这种情况,你需要一个更详细的自定义实现,它需要了解文件系统,知道什么是目录,什么是文件。
英文:
vodolaz095's answer is the simplest, but if you really must do it in Go, you could wrap the FileServer to catch the specific case of a request for the root:
func noIndex(fs http.Handler) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		if r.URL.Path == "" || strings.HasSuffix(r.URL.Path, "/") {
			w.Write("")
			return
		}
		fs.ServeHTTP(w, r)
	}
}
Note that this doesn't catch requests for subdirectories without a trailing slash in the URL; to trap this you'd need a much more detailed custom implementation that was filesystem-aware to know what is a directory and what is a file.
答案3
得分: 0
看起来你正在使用gorilla/mux,但如果你不介意使用标准库的http.ServeMux,你可以在Go代码中这样实现:
func main() {
    fs := http.FileServer(http.Dir("./static/"))
    h := http.NewServeMux()
    blank := http.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) {})
    h.Handle("/static/", http.StripPrefix("/static/", fs)) // 匹配"/static"并重定向...
    h.Handle("/static", blank)                             // ...除非你显式地创建一个处理程序
    http.ListenAndServe(":8080", h)
}
来自http.ServeMux文档:
...如果已经注册了一个子树,并且收到了一个不带尾部斜杠的子树根的请求,ServeMux会将该请求重定向到子树根(添加尾部斜杠)。可以通过单独为不带尾部斜杠的路径注册来覆盖此行为。例如,注册"/images/"会导致ServeMux将对"/images"的请求重定向到"/images/",除非"/images"已经单独注册。
英文:
It looks like you are using gorilla/mux - but if you don't mind using the standard library's http.ServeMux you can achieve this in Go code like so:
func main() {
	fs := http.FileServer(http.Dir("./static/"))
	h := http.NewServeMux()
	blank := http.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) {})
	h.Handle("/static/", http.StripPrefix("/static/", fs)) // will match "/static" with a redirect ...
	h.Handle("/static", blank)                             // ... unless you create a hanlder explicitly
	http.ListenAndServe(":8080", h)
}
from http.ServeMux docs:
> ...if a subtree has been registered and a request is received naming
> the subtree root without its trailing slash, ServeMux redirects that
> request to the subtree root (adding the trailing slash). This behavior
> can be overridden with a separate registration for the path without
> the trailing slash. For example, registering "/images/" causes
> ServeMux to redirect a request for "/images" to "/images/", unless
> "/images" has been registered separately.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论