I followed the Go Writing Web Applications tutorial but for whatever reason I am having trouble getting the app to serve CSS and JS. If I run my static page without the Go server the page CSS works fine. When I run the Go server on the other hand the CSS just doesn't work.
Here is what my HTML sort of looks like:
<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">
then under the body
tag:
<script src="../assets/js/jquery.min.js"></script>
<script src="../assets/js/bootstrap.min.js"></script>
My file tree looks like this:
go-affect/
├── data
│ └── …
├── static
│ ├── css
│ │ └── …
│ └── js
│ │ └── …
├── tmpl
│ ├── edit.html
│ ├── index.html
│ └── view.html
└── main.go
How do I get my Go application to serve the CSS and JavaScript I need?
EDIT:
The problem has since been solved, here is the working main:
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)
}
Here is an example of the handlers I am using:
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/")))
Would serve your css
directory at /
. Of course you can serve whichever directory at whatever path you choose.
You probably want to make sure that the static path isn't in the way of other paths and use something like this.
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
Placing both your js
and css
in the directory static
in your project. This would then serve them at domain.com/static/css/filename.css
and domain.com/static/js/filename.js
The StripPrefix
method removes the prefix, so it doesn't try to search e.g. in the static
directory for static/css/filename.css
which, of course, it wouldn't find. It would look for css/filename.css
in the static
directory, which would be correct.