我遵循了Go Writing Web Applications教程,但是无论出于什么原因,我都很难使该应用程序能够服务CSS和JS。如果我在没有Go服务器的情况下运行静态页面,则页面CSS可以正常工作。另一方面,当我运行Go服务器时,CSS无效。
这是我的HTML外观:
<link rel="stylesheet" href="../assets/css/bootstrap.min.css"> <link rel="stylesheet" href="../assets/css/bootstrap-theme.min.css"> <link rel="stylesheet" href="../assets/css/custom.css">
然后在body标记下:
body
<script src="../assets/js/jquery.min.js"></script> <script src="../assets/js/bootstrap.min.js"></script>
我的文件树如下所示:
go-affect/ ├── data │ └── … ├── static │ ├── css │ │ └── … │ └── js │ │ └── … ├── tmpl │ ├── edit.html │ ├── index.html │ └── view.html └── main.go
如何获得Go应用程序以提供所需的CSS和JavaScript?
此问题已经解决,这里是主要的工作方式:
func main() { http.HandleFunc("/view/", makeHandler(viewHandler)) http.HandleFunc("/edit/", makeHandler(editHandler)) http.HandleFunc("/save/", makeHandler(saveHandler)) http.HandleFunc("/index/", makeHandler(indexHandler)) http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static")))) http.ListenAndServe(":8080", nil) }
这是我使用的处理程序的示例:
func indexHandler(w http.ResponseWriter, r *http.Request, title string) { p := &Page{Title: title} err := templates.ExecuteTemplate(w, "index.html", p) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } }
http.Handle("/", http.FileServer(http.Dir("css/")))
将在提供您的css目录/。当然,您可以在任意路径下为任何目录提供服务。
css
/
您可能要确保静态路径不会妨碍其他路径,并使用类似的方法。
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
将js和都放置在项目css的目录static中。那么这将在为他们提供服务domain.com/static/css/filename.css和domain.com/static/js/filename.js
js
static
domain.com/static/css/filename.css
domain.com/static/js/filename.js
该StripPrefix方法删除了前缀,因此它不会尝试在当然找不到的static目录中进行搜索static/css/filename.css。它将css/filename.css在static目录中查找,这是正确的。
StripPrefix
static/css/filename.css
css/filename.css