英文:
golang static stop index.html redirection
问题
package main
import (
"log"
"net/http"
)
func main() {
fs := http.FileServer(http.Dir("."))
http.Handle("/", http.NotFoundHandler()) // 使用 http.NotFoundHandler() 替代 fs,停止显示 index.html 文件
log.Println("Listening...")
http.ListenAndServe(":3000", nil)
}
以上是修改后的代码,使用 http.NotFoundHandler()
替代了 fs
,这样服务器将不再显示 index.html
文件。
英文:
package main
import (
"log"
"net/http"
)
func main() {
fs := http.FileServer(http.Dir("."))
http.Handle("/", fs)
log.Println("Listening...")
http.ListenAndServe(":3000", nil)
}
So I have a index.html file and want server to stop showing it.
答案1
得分: 2
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 {
// 处理错误
return
}
http.ServeContent(w, r, "index.html", time.Now(), f)
})
请注意,我使用的是ServeContent,而不是ServeFile,因为ServeFile
会以与FileServer
相同的方式处理/index.html
请求。
英文:
The docs for FileServer state that:
> As a special case, the returned file server redirects any request
> ending in "/index.html" to the same path, without the final
> "index.html".
So /index.html
is redirected to /
, /foo/bar/index.html
is redirected to /foo/bar/
.
To avoid this register an additional handler for the special case.
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)
})
Please note I'm using ServeContent insead of ServeFile because ServeFile
handles /index.html
requests the same way as FileServer
.
答案2
得分: 1
没有重定向,当请求一个目录时,默认渲染的文件是 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")
英文:
There's no redirection going on, the default file to render when requesting a directory is index.html
. The directory listing is a fallback for when this file isn't found, so you can't get a directory listing without removing the index.html
file.
If you want a directory listing, you'll have to write it out yourself, which you can then format and style however you choose. The basic structure is very simple if you want to write it directly, take the internal dirList
function for example:
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")
答案3
得分: 0
我认为有三种方法:
- 提交一个 PR,允许访问
/index.html
而不会重定向到 golang 的 net/http/fs 库。https://github.com/golang/go/issues/53870 - 修改你的代码:将
/index.html
替换为/
,以停止 301 重定向,例如:https://github.com/ahuigo/go-lib/commit/1a99191d5c01cf9025136ce8ddb9668f123de05c#diff-67e8621fbb99281a50c089bae53d4874663d3d21ca5e90809ec207c070029351R44 - 自定义你自己的 http fs 处理程序,而不使用官方工具。
英文:
I think there are 3 ways:
- Make a PR which allow accessing
/index.html
without redirect to golang's net/http/fs library. https://github.com/golang/go/issues/53870 - Hack your code: replace
/index.html
with/
to stop 301 redirect, e.g., https://github.com/ahuigo/go-lib/commit/1a99191d5c01cf9025136ce8ddb9668f123de05c#diff-67e8621fbb99281a50c089bae53d4874663d3d21ca5e90809ec207c070029351R44 - Customize your own http fs handler instead of official tools.
答案4
得分: 0
假设你有一个名为"images"的目录用于存放图片,代码如下:
http.Handle("/images/", http.StripPrefix("/images/", http.FileServer(http.Dir("images"))))
但是你不想公开其中的所有文件名。正如人们所说,“沉默是金”。
在浏览器中,默认情况下,访问/images
、/images/
或/images/index.html
会显示该目录下的所有文件列表,这并不是你希望意外发生的事情。
我认为最简单的解决方案是通过命令行执行以下操作:
touch index.html
这将创建一个空文件,阻止自动生成的images/index.html目录列表的显示。同时,这不会阻止访问其中的任何图片。当然,黑客仍然可以尝试通过暴力猜测文件名来获取其中的文件,所以你需要保持一些常识。
英文:
Let's say you have an "images" directory for your images, like this:
http.Handle("/images/", http.StripPrefix("/images/", http.FileServer(http.Dir("images"))))
But you don't want to expose all the filenames in there. As people say, "Silence is golden."
In a browser, by default, going to /images
or /images/
or /images/index.html
shows a listing of all the files there, which is not really something you want to do accidentally.
I think the easiest solution from the command-line:
touch index.html
This creates an empty file that blocks the auto-generated images/index.html directory listing. And this doesn't block access to any of the images in there. Of course, a hacker could still try to brute-force guess what files are in there, so you need to use some common sense.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论