使用 Go 的网络服务器,网站的根映射到文件系统的哪里?

With Go's webserver where does the root of the website map onto the filesystem?

Go net/http 网络服务器的文件系统 "root" 在哪里。它似乎不在可执行文件所在的目录中。 "root" 是指我将用于 imgsrc 属性的目录,没有任何路径。我不打算这样做,但如果我知道它会帮助我理解结构。

简介

在 Go 中,net/http 包用于提供 Web 服务器功能。这不是静态文件服务器,它远不止于此。

没有文件系统"root"的概念。提供的网络服务器使用 handlers to serve HTTP requests which are mapped to URLs. A handler is responsible to process an HTTP request and to setup and generate the response. A handler can be registered e.g. with the Handle() or HandleFunc() functions. The server can be started with the ListenAndServe() 函数。

阅读 net/http 的包文档以了解基本概念并开始使用。它还包含许多小示例。

博客文章 Writing Web Applications 也很有帮助。

静态文件服务器

但是,提供静态文件服务器或 "filesystem" 功能,http 包中有一个 FileServer() 函数,其中 returns 一个 Handler它提供静态文件。您可以指定 "root" 文件夹作为 FileServer().

的参数提供静态文件

如果您将 绝对 路径传递给 FileServer(),那么毫无疑问这意味着什么。如果您提供 relative 路径,它总是在 currentworking 目录的上下文中解释.默认情况下,这是您启动应用程序的文件夹(执行 go run ... 命令或编译的可执行二进制文件时所在的文件夹)。

示例:

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

这将设置一个处理程序来为映射到根 URL / 的文件夹 /tmp 中的文件提供服务。例如,对 GET 请求 "/mydoc.txt" 的响应将是 "/tmp/mydoc.txt" 静态文件。

完成申请:

package main
import (
    "log"
    "net/http"
)
func main() {
    // Simple static webserver:
    http.Handle("/", http.FileServer(http.Dir("/tmp")))
    log.Fatal(http.ListenAndServe(":8080", nil))
}

您可以使用 StripPrefix() 函数进行更复杂的映射。示例:

// To serve a directory on disk (/tmp) under an alternate URL
// path (/tmpfiles/), use StripPrefix to modify the request
// URL's path before the FileServer sees it:
http.Handle("/tmpfiles/",
    http.StripPrefix("/tmpfiles/", http.FileServer(http.Dir("/tmp"))))