在高朗,我如何提供根目录之外的静电内容,同时仍然有一个用于服务主页的根目录处理程序.

以以下简单的Web服务器为例:

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", HomeHandler) // homepage
    http.ListenAndServe(":8080", nil)
}

func HomeHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "HomeHandler")
}

如果我这么做了

http.Handle("/", http.FileServer(http.Dir("./")))

我收到一个panic 的消息,说我有两个"/"的注册.我在互联网上找到的每个Golang示例都建议从不同的目录中提供静态内容,但这对sitemap之类的东西没有多大帮助.xml,法维康.伊科,机器人.txt和其他文件,按照惯例或强制要求总是从根目录中提供.

我寻找的行为是大多数web服务器(如Apache、Nginx或IIS)中的行为,它首先遍历您的规则,如果未找到任何规则,它将查找实际文件,如果未找到任何文件,它将执行404.我的猜测是,我需要写一个http.Handler来判断我是否引用了一个带有扩展名的文件,而不是写一个http.HandlerFunc,如果是,则判断文件是否存在并提供文件,否则它会404或提供主页,请求是"/".不幸的是,我甚至不知道如何开始这样的任务.

我的一部分说,我把情况过度复杂化了,这让我觉得我错过了什么?任何指导都将不胜感激.

推荐答案

我想到的一件事可能会对您有所帮助,那就是您可以创建自己的ServeMux.我在您的示例中添加了CHTP,这样CHTP就是一个ServeMux,您可以使用它来服务静电文件.然后,HomeHandler判断它是否应该提供文件.我只是判断一下有没有"."但是你可以做很多事情.这只是一个 idea ,可能不是你想要的.

package main

import (
    "fmt"
    "net/http"
    "strings"
)   

var chttp = http.NewServeMux()

func main() {

    chttp.Handle("/", http.FileServer(http.Dir("./")))

    http.HandleFunc("/", HomeHandler) // homepage
    http.ListenAndServe(":8080", nil)
}   

func HomeHandler(w http.ResponseWriter, r *http.Request) {

    if (strings.Contains(r.URL.Path, ".")) {
        chttp.ServeHTTP(w, r)
    } else {
        fmt.Fprintf(w, "HomeHandler")
    }   
} 

Go相关问答推荐

Docker容器之间的连接被拒绝

Go编译器标志-修剪路径不完全工作

try 用GitHub操作中的release标签更新version. go文件,但失败了

你能帮我优化一个golang代码关于函数CrossPointTwoRect

如何用Golang解码这个嵌套的json?

golang regex基于关键字拆分字符串

为什么 Go 对于长度为 100k 的切片使用的内存比长度为 100k 的数组要少?

使用 Golang 获取目录磁盘使用情况

如何将任何类型的数据值传递到 Golang 中的 GRPC Protobuf struct ?

无法将 graphql-ws 连接到 gqlgen

如何使用名称具有包名称的嵌套 struct 启动 go struct

CBC Decrypter 解密加密文本,但部分文本被随机字符替换

致命错误:找不到由 zergon321/reisen 引起的libavcodec/avcodec.h文件

将 .gz 文件添加到 tar.gz 文件,但在添加之前解码 gz.输出文件被剪辑(损坏)

如何使用特定的 Go 版本运行 govulncheck?

如何在Golang中的差异函数中杀死命令Exec

curl:(56)Recv失败:连接由golang中的对等方与docker重置

go mod tidy 错误消息:但是 go 1.16 会 Select

Golang 有类似 C++ 的 decltype 的东西吗?

手动下载并放置一个 golang mod 文件