php Editor Banana found that when using Go language to develop web applications, we sometimes encounter a common problem: when we try to access the web endpoint, we receive a 404 Error, prompting that the static index.html file cannot be found. This question can be confusing for developers, especially for beginners. So, how should we solve this problem? Next, we will introduce the solution in detail to help you solve this problem smoothly.
This is my code:
package main import ( "fmt" "log" "net/http" ) const customport = "3001" func main() { fileserver := http.fileserver(http.dir("./static")) port:= fmt.sprintf(":%s", customport) http.handle("/", fileserver) fmt.printf("starting front end service on port %s", port) err := http.listenandserve(port, nil) if err != nil { log.panic(err) } }
The top level folder is microservices
and is set up as the go workspace. This web service will be one of many. It is located in the following folder:
microservices |--frontend |--cmd |--web |--static |--index.html |--main.go
I'm in the top level microservice folder and I start it with: go run ./frontend/cmd/web
. It starts fine with no errors. But when I go to chrome and type http://localhost:3001
I get 404 Page Not Found. Even http://localhost:3001/index.html
will give 404 Page Not Found. I just learned go and I don’t know why I can’t find the ./static
folder?
According to your command, the path must be ./frontend/cmd/web/static, not just ./static. That's not portable; the path changes with the working directory.
Consider embedding static directories. Otherwise, you must make the path configurable (flags, environment variables, etc.)
The disadvantage of embedding is that you have to rebuild the program after making any changes to the static files.
You can also use a hybrid approach. If the flag (or other) is set, use that to serve from disk, otherwise use the embedded file system. This flag is convenient during development, and the embedded file system makes deployment easy since you only need to copy the program binaries.
package main import ( "embed" "flag" "io/fs" "net/http" "os" ) //go:embed web/static var embeddedAssets embed.FS func main() { var staticDir string flag.StringVar(&staticDir, "static-dir", staticDir, "Path to directory containing static assets. If empty embedded assets are used.") flag.Parse() var staticFS fs.FS = embeddedAssets if staticDir != "" { staticFS = os.DirFS(staticDir) } http.Handle("/", http.FileServer(http.FS(staticFS))) // ... }
The above is the detailed content of Go web endpoint cannot find static index.html file. For more information, please follow other related articles on the PHP Chinese website!