gpt4 book ai didi

http - 第二个FileServer提供html但不提供图像

转载 作者:行者123 更新时间:2023-12-01 21:11:19 25 4
gpt4 key购买 nike

构建简单的API时,我遇到了Go和gorilla/mux路由器的以下问题。我敢肯定,这是我脸上常见的愚蠢错误,但我看不到。

简化的项目结构

|--main.go
|
|--public/--index.html
| |--image.png
|
|--img/--img1.jpg
| |--img2.jpg
| |--...
|...
main.go
package main

import (
"net/http"
"github.com/gorilla/mux"
)

var Router = mux.NewRouter()

func InitRouter() {
customers := Router.PathPrefix("/customers").Subrouter()

customers.HandleFunc("/all", getAllCustomers).Methods("GET")
customers.HandleFunc("/{customerId}", getCustomer).Methods("GET")
// ...
// Registering whatever middleware
customers.Use(middlewareFunc)

users := Router.PathPrefix("/users").Subrouter()

users.HandleFunc("/register", registerUser).Methods("POST")
users.HandleFunc("/login", loginUser).Methods("POST")
// ...

// Static files (customer pictures)
var dir string
flag.StringVar(&dir, "images", "./img/", "Directory to serve the images")
Router.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir(dir))))

var publicDir string
flag.StringVar(&publicDir, "public", "./public/", "Directory to serve the homepage")
Router.Handle("/", http.StripPrefix("/", http.FileServer(http.Dir(publicDir))))
}

func main() {
InitRouter()
// Other omitted configuration
server := &http.Server{
Handler: Router,
Addr: ":" + port,
// Adding timeouts
WriteTimeout: 15 * time.Second,
ReadTimeout: 15 * time.Second,
}

err := server.ListenAndServe()
// ...
}

子路由可以与中间件及其他所有组件一起正常工作。如果我转到 img,则可以正确提供 localhost:5000/static/img1.png下的图像。

事实是,转到 localhost:5000将提供驻留在 index.html中的 public,但是 localhost:5000/image.png却是 404 not found

这是怎么回事

最佳答案

更改此行:

// handles '/' and *ONLY* '/'
Router.Handle("/",
http.StripPrefix("/", http.FileServer(http.Dir(publicDir))))

对此:
// handles '/' and all sub-routes
Router.PathPrefix("/").Handler(
http.StripPrefix("/",http.FileServer(http.Dir(publicPath))))

基本上,在您的原始代码中, /的路由器将处理此路径,并且仅处理该路径(无子路由)。

您可能想知道为什么您的原始代码至少对一个文件( index.html)有效。原因是 http.FileServer给定的路径是目录(而不是文件),默认情况下将提供索引页文件 index.html(请参阅 FileServer source)。

使用 PathPrefix允许(文件服务器)处理程序接受路径 /以下的所有URL路径。

关于http - 第二个FileServer提供html但不提供图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60760508/

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