gpt4 book ai didi

webserver - 从根目录提供主页和静态内容

转载 作者:IT老高 更新时间:2023-10-28 12:59:22 25 4
gpt4 key购买 nike

在 Golang 中,我如何在根目录之外提供静态内容,同时仍然拥有用于服务主页的根目录处理程序。

以下面的简单网络服务器为例:

package main

import (
"fmt"
"net/http"
)

func main() {
http.HandleFunc("/", HomeHandler) // homepage
http.ListenAndServe(":8080", nil)
}

func HomeHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "HomeHandler")
}

如果我这样做

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

我收到一条 panic 消息,说我有两个“/”注册。我在 Internet 上找到的每个 Golang 示例都建议从不同的目录中提供静态内容,但这对于 sitemap.xml、favicon.ico、robots.txt 和其他实践文件或强制要求始终从根目录中提供服务。

我寻求的行为是在大多数 Web 服务器(如 Apache、Nginx 或 IIS)中发现的行为,它首先遍历您的规则,如果没有找到规则,它会查找实际文件,如果没有文件发现它是404s。我的猜测是,我不需要编写 http.HandlerFunc,而是需要编写一个 http.Handler 来检查我是否引用了带有扩展名的文件,如果是,则检查文件存在并提供文件,否则 404s 或提供主页是对“/”的请求。不幸的是,我什至不确定如何开始这样的任务。

我的一部分说我把情况过度复杂化了,这让我觉得我错过了什么?任何指导将不胜感激。

最佳答案

另一种(不使用 ServeMux)解决方案是显式提供位于根目录中的每个文件。背后的想法是保持基于根文件的数量非常小。 sitemap.xml , favicon.ico , robots.txt确实被要求从根目录中提供服务:

package main

import (
"fmt"
"net/http"
)

func HomeHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "HomeHandler")
}

func serveSingle(pattern string, filename string) {
http.HandleFunc(pattern, func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, filename)
})
}

func main() {
http.HandleFunc("/", HomeHandler) // homepage

// Mandatory root-based resources
serveSingle("/sitemap.xml", "./sitemap.xml")
serveSingle("/favicon.ico", "./favicon.ico")
serveSingle("/robots.txt", "./robots.txt")

// Normal resources
http.Handle("/static", http.FileServer(http.Dir("./static/")))

http.ListenAndServe(":8080", nil)
}

请将所有其他资源(CSS、JS 等)移动到适当的子目录,例如/static/ .

关于webserver - 从根目录提供主页和静态内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14086063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com