【问题标题】:With Go's webserver where does the root of the website map onto the filesystem?使用 Go 的网络服务器,网站的根在哪里映射到文件系统?
【发布时间】:2015-04-28 23:45:29
【问题描述】:

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

【问题讨论】:

  • 没什么大不了的,但有人刚刚编辑了我的问题。我对这里的礼节不太熟悉,但这似乎有点霸道。

标签: go webserver


【解决方案1】:

简介

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

没有文件系统“根”的概念。提供的 Web 服务器使用 handlers 来处理映射到 URL 的 HTTP 请求。处理程序负责处理 HTTP 请求并设置和生成响应。可以注册处理程序,例如使用Handle()HandleFunc() 函数。可以使用ListenAndServe()函数启动服务器。

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

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

静态文件服务器

但是,提供了静态文件服务器或“文件系统”功能,http 包中有一个FileServer() 函数,它返回一个为静态文件提供服务的Handler。您可以指定“根”文件夹作为FileServer() 的参数来提供静态文件。

如果您将绝对 路径传递给FileServer(),那么毫无疑问这意味着什么。如果您提供 relative 路径,它总是在 currentworking 目录的上下文中解释。默认情况下,这是您启动应用程序的文件夹(执行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”相对于哪里:文件系统根目录?在 golang 文件夹层次结构中的某个位置?
  • @quanglewangle "/tmp" 是一个绝对路径。在 unix 系统上,根文件夹是 /。请参阅我编辑的答案,其中详细说明了 absoluterelative 路径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 2014-12-15
  • 2021-08-18
相关资源
最近更新 更多