gpt4 book ai didi

go - http.HandleFunc 与静态文件

转载 作者:数据小太阳 更新时间:2023-10-29 03:28:28 36 4
gpt4 key购买 nike

我正在构建一个网页。该页面应该能够处理不同的 http 方法(GETPOST...)。我的页面在技术上工作并处理每种类型的请求,但在 GET 请求的情况下(在根 "/" 处提供 index.html路径),我的页面显示不正确。图像或 css 均未正确显示,可能是因为找不到这些文件。

Ugly page

我注意到 http.Handle 在替换到我下面的 server.go 代码中时提供了比 http.HandleFunc 更好的结果,因为图像和 css 使用以下方法正确显示:

http.FileServer(http.Dir("static"))
http.Handle("/", http.StripPrefix("/", fs))

以下是我的网络服务器,图像和 css 显示不正确。总的来说,我的意图是对所有内容使用静态文件,包括 html(例如 index.html),并仅使用标准 go 来实现一些解决方案。

server.go代码

package main

import (
"net/http"
"fmt"
)

func indexHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Add("Content Type", "text/html")
switch r.Method {
case "GET":
http.ServeFile(w, r, "./static/index.html")
case "POST":
fmt.Pprintf(w, "POST!")
case "PUT":
fmt.Pprintf(w, "PUT!")
case "DELETE":
fmt.Pprintf(w, "DELETE!")
default:
fmt.Pprintf(w, "Default!")
}
}

func main() {
http.HandleFunc("/", indexHandler)
http.ListenAndServe(":3000", nil)
}

最佳答案

您已将服务器硬编码为始终为任何 GET 请求返回 index.html,无论请求的是什么。因此,如果您的 index.html 包含对 style.css 的引用,浏览器将对 style.css 发出第二个请求,而您'将再次返回 index.html

我假设您正在尝试做的是让所有 GET 请求返回静态文件,而其他动词将执行其他操作。您只需要将它们传递给文件服务器:

root := "static"
...
case "GET":
if r.URL.Path == "" || r.URL.Path == "/" {
http.ServeFile(w, r, path.Join(root, "index.html"))
} else {
http.ServeFile(w, r, path.Join(root, r.URL.Path))
}

请注意,在您的处理程序被调用时,URL 中的所有“..”引用都已被删除,攻击者无法使用它来逃避您的静态树。但是 ServeFile() 将返回目录列表,因此您需要检查它是否存在问题。

关于go - http.HandleFunc 与静态文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31101814/

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