从根目录提供主页和静态内容

2024-02-06

在 Golang 中,如何在根目录之外提供静态内容,同时仍然拥有用于提供主页的根目录处理程序。

使用以下简单的 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")
}

If I do

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

我收到一条恐慌消息,说我有两个“/”注册。我在互联网上找到的每个 Golang 示例都建议从不同的目录中提供静态内容,但这对于 sitemap.xml、favicon.ico、robots.txt 和其他实践或实践的文件没有多大帮助。强制要求始终从根目录提供服务。

我寻求的行为是在大多数 Web 服务器(例如 Apache、Nginx 或 IIS)中发现的行为,它首先遍历您的规则,如果没有找到规则,它会查找实际文件,如果没有找到文件,它会查找实际文件。 404。我的猜测是,而不是写一个http.HandlerFunc,我需要写一个http.Handler它检查我是否正在引用带有扩展名的文件,如果是,则检查文件是否存在并提供该文件,否则它会 404s 或提供主页,因为请求是针对“/”的。不幸的是,我不确定如何开始这样的任务。

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


另一种选择(不使用ServeMux http://golang.org/pkg/net/http/#ServeMux)解决方案是显式地提供位于根目录中的每个文件。背后的想法是保持基于根的文件数量非常少。站点地图.xml http://en.wikipedia.org/wiki/Sitemap.xml, 图标.ico http://en.wikipedia.org/wiki/Favicon.ico, 机器人.txt http://en.wikipedia.org/wiki/Robots.txt确实被要求从根中提供服务:

package main

import (
    "fmt"
    "net/http"
)

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

func serveSingle(pattern string, filename string) {
    http.HandleFunc(pattern, func(w http.ResponseWriter, r *http.Request) {
        http.ServeFile(w, r, filename)
    })
}

func main() {
    http.HandleFunc("/", HomeHandler) // homepage

    // Mandatory root-based resources
    serveSingle("/sitemap.xml", "./sitemap.xml")
    serveSingle("/favicon.ico", "./favicon.ico")
    serveSingle("/robots.txt", "./robots.txt")

    // Normal resources
    http.Handle("/static", http.FileServer(http.Dir("./static/")))

    http.ListenAndServe(":8080", nil)
}

请将所有其他资源(CSS、JS 等)移至适当的子目录,例如/static/ .

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从根目录提供主页和静态内容 的相关文章

随机推荐

  • 如何创建堆叠折线图 D3,多个 Y 轴和公共 X 轴

    我正在尝试使用 d3 创建一个折线图 该折线图将有多个 y 轴 但有一个公共 x 轴 有人可以为我提供如何使用 D3 库创建它的示例吗 它应该如下所示 很简单 只需绘制 2 个图表 但仅附加一个 x 轴 这里有一个小提琴可以帮助您入门 ht
  • C++ 无法计算包含向量大小的公式?

    int main vector
  • Visual Studio 使用标准格式复制/粘贴到 Outlook 中?

    我在 Visual Studio 中有包含深色背景的自定义设置 复制 粘贴到 Outlook 会对邮件的白色背景上的代码中的深色背景产生视觉犯罪 有谁知道如何以标准和格式粘贴代码 不是特殊粘贴中的未格式化文本 也不使用我的自定义 VS 格式
  • 如何在滚动运算符中访问多列?

    我想在 pandas 中进行一些滚动窗口计算 需要同时处理两列 我举一个简单的例子来清楚地表达问题 import pandas as pd df pd DataFrame x 1 2 3 2 1 5 4 6 7 9 y 4 3 4 6 5
  • Django 多对多模型 DRF

    我有以下模型结构 class Project models Model author models ManyToManyField Account name models CharField max length 40 default Ne
  • 如何在View和ViewModel之间传递数据

    我是 MVVM 设计模式的新手 我正在尝试创建一个简单的应用程序 其中主窗口中显示学生列表 我希望用户能够将新学生添加到我已完成的列表中绑定学生数据所在的可观察集合 但如何通过从文本框中获取数据并将其用作命令中的参数来创建新用户 这是我的观
  • 如何测试飞行路线迁移?

    通常迁移脚本很简单 例如添加新列等 如果应用程序已部署 则一切正常 但有时需要测试一些复杂的逻辑 推荐的方法是什么 有一个单独的数据库用于测试 将其作为每个构建的一部分进行迁移 并针对它运行测试 您还可以根据需要添加额外的测试数据 包括用于
  • Laravel Sanctum 可以使用 Multiauth 防护

    我正在用 laravel sainttum 进行测试 但这里有一些问题 我正在创建管理员警卫 当我将中间件更改为 auth sanctum admin 它应该只能由管理员访问 但在这里我可以使用带有网络防护的普通用户帐户进行访问 我不知道为
  • 有没有一种方法可以创建一个 pandas 数据框,其行是整数,这些整数会增加直到每行达到某个值?

    例如 假设我有整数数组 5 3 7 6 4 我希望找到一种有效的方法来创建如下所示的 pandas 数据框 数据帧中的第一行应包含数字 1 到 5 第二行应包含数字 1 到 3 依此类推 有没有办法在不循环的情况下实现这一目标 一个简单的单
  • 将枚举值传递给 PowerShell 中的函数

    我有一个接受枚举值作为参数的函数 举个例子 考虑一下这样的事情 PS gt function IsItFriday System DayOfWeek dayOfWeek if dayOfWeek eq System DayOfWeek Fr
  • SQL 行之间的差异

    我有一个像这样的 SQL 2008 数据库表 name score steve 207 steve 205 steve 200 steve 139 我想得到行之间的差异 eqn 行 行 1 所以我理想地希望它是 steve 2 207 20
  • 如何编写 Nexus Rest Api 的 Get 方法?

    I have groupId artifactId and version 如何使用 Nexus Rest API 编写 GET 请求以获得进一步的工件描述 不确定您要查找什么信息 REST API 文档可在此处获取 Core API ht
  • 如何在 Xamarin Forms 中获取设备的 GPS 位置?

    我想在输入框名为时获取我的设备的经度和纬度实体位置 is focused 我在用Xamarin Essential 地理定位为了获取我的设备的 GPS 位置 我按照文档和教程进行操作 但仍然无法获取 GPS 位置 我已经在我的 Androi
  • 如何在 Android webview 中打开 Microsoft Teams 会议

    我正在尝试在 Web 视图中打开 Microsoft Teams 会议 当我在 Web 视图中打开会议网址时 它开始寻找 MS Teams 应用程序 这是我不想要的 我只想在 Web 视图中参加会议 请帮助我在 Android 应用程序的
  • 包括 ionic 2/Angular 2 的通用标题栏

    我有一个 ionic 2 标题栏 其中包含主页或注销按钮和公司标志这对于所有页面都是通用的 我如何编写一个通用函数 Injectable 这样就可以很容易地包含在所有页面中 而不是重复代码
  • Protractor + AngularJS + Jasmine 在xml文件上获取输出结果

    我正在尝试将量角器结果导出到 xml 文件 我在网上找到了这个很棒的链接 https github com angular protractor issues 60 https github com angular protractor i
  • QMessageBox 带有“不再显示”复选框

    如何显示下面带有 不再显示 复选框的消息框 我想象的东西看起来像这样 Qt 5 2 添加了添加QCheckBox to a QMessageBox 看一下QMessageBox setCheckbox http doc qt io qt 5
  • 同时在 iPhone 和模拟器上进行多点连接测试

    您好 我正在论坛的所有主题中搜索有关如何测试使用多点连接框架的应用程序的信息 有人可以告诉我如何同时使用 iPhone 设备和模拟器 设备上的播放器一和模拟器上的播放器二 来测试应用程序 反之亦然 我已经通过使用两个模拟器 每个 mac 一
  • Stack (Haskell) 使用 GitHub Actions 构建源文件的缓存

    当使用本地构建我的 Haskell 项目时stack build 仅重新编译更改的源文件 不幸的是 我无法让 Stack 在 GitHub Actions 上表现得像这样 请问有什么建议吗 Example 我创建了一个简单的例子Lib hs
  • 从根目录提供主页和静态内容

    在 Golang 中 如何在根目录之外提供静态内容 同时仍然拥有用于提供主页的根目录处理程序 使用以下简单的 Web 服务器作为示例 package main import fmt net http func main http Handl