【发布时间】:2015-04-28 23:45:29
【问题描述】:
Go net/http 网络服务器的文件系统“根”在哪里。它似乎不在可执行文件所在的目录中。
“root”是指我将用于src 属性的目录,例如img,没有任何路径。我不打算这样做,但如果我知道的话,它会帮助我理解结构。
【问题讨论】:
-
没什么大不了的,但有人刚刚编辑了我的问题。我对这里的礼节不太熟悉,但这似乎有点霸道。
Go net/http 网络服务器的文件系统“根”在哪里。它似乎不在可执行文件所在的目录中。
“root”是指我将用于src 属性的目录,例如img,没有任何路径。我不打算这样做,但如果我知道的话,它会帮助我理解结构。
【问题讨论】:
在 Go 中,net/http 包用于提供 Web 服务器功能。这不是一个静态文件服务器,它远不止于此。
没有文件系统“根”的概念。提供的 Web 服务器使用 handlers 来处理映射到 URL 的 HTTP 请求。处理程序负责处理 HTTP 请求并设置和生成响应。可以注册处理程序,例如使用Handle() 或HandleFunc() 函数。可以使用ListenAndServe()函数启动服务器。
阅读net/http 的包文档以了解基本概念并开始使用。它还包含许多小例子。
博客文章Writing Web Applications 也很有帮助。
但是,提供了静态文件服务器或“文件系统”功能,http 包中有一个FileServer() 函数,它返回一个为静态文件提供服务的Handler。您可以指定“根”文件夹作为FileServer() 的参数来提供静态文件。
如果您将绝对 路径传递给FileServer(),那么毫无疑问这意味着什么。如果您提供 relative 路径,它总是在 current 或 working 目录的上下文中解释。默认情况下,这是您启动应用程序的文件夹(执行go run ... 命令或编译的可执行二进制文件时所在的文件夹)。
例子:
http.Handle("/", http.FileServer(http.Dir("/tmp")))
这将设置一个处理程序来提供文件夹 /tmp 中映射到根 URL / 的文件。例如,对 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"))))
【讨论】:
"/tmp" 是一个绝对路径。在 unix 系统上,根文件夹是 /。请参阅我编辑的答案,其中详细说明了 absolute 和 relative 路径。