在 Golang 中,如何在根目录之外提供静态内容,同时仍然拥有用于提供主页的根目录处理程序。
使用以下简单的 Web 服务器作为示例:
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")
}
If I do
http.Handle("/", http.FileServer(http.Dir("./")))
我收到一条恐慌消息,说我有两个“/”注册。我在互联网上找到的每个 Golang 示例都建议从不同的目录中提供静态内容,但这对于 sitemap.xml、favicon.ico、robots.txt 和其他实践或实践的文件没有多大帮助。强制要求始终从根目录提供服务。
我寻求的行为是在大多数 Web 服务器(例如 Apache、Nginx 或 IIS)中发现的行为,它首先遍历您的规则,如果没有找到规则,它会查找实际文件,如果没有找到文件,它会查找实际文件。 404。我的猜测是,而不是写一个http.HandlerFunc
,我需要写一个http.Handler
它检查我是否正在引用带有扩展名的文件,如果是,则检查文件是否存在并提供该文件,否则它会 404s 或提供主页,因为请求是针对“/”的。不幸的是,我不确定如何开始这样的任务。
我的一部分说我把情况过于复杂化了,这让我觉得我错过了什么?任何指导将不胜感激。
另一种选择(不使用ServeMux http://golang.org/pkg/net/http/#ServeMux)解决方案是显式地提供位于根目录中的每个文件。背后的想法是保持基于根的文件数量非常少。站点地图.xml http://en.wikipedia.org/wiki/Sitemap.xml, 图标.ico http://en.wikipedia.org/wiki/Favicon.ico, 机器人.txt http://en.wikipedia.org/wiki/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/
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)