当前位置: 首页 > 面试题库 >

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

陈晟睿
2023-03-14
问题内容

在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")
}

如果我做

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

我收到一个恐慌,说我有两个针对“
/”的注册。我在互联网上找到的每个Golang示例都建议从不同目录中提供其静态内容,但这对于sitemap.xml,favicon.ico,robots.txt和其他按惯例或始终必须从根本上得到服务。

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

我的一部分说我正在使情况变得过于复杂,这使我觉得我缺少了什么?任何指导将不胜感激。


问题答案:

我想到的一件事可能对您有所帮助,您可以创建自己的ServeMux。我在您的示例中添加了内容,使chttp是一个ServeMux,您可以为其提供静态文件。然后,HomeHandler会检查它是否应该提供文件。我只是检查一个“。”
但您可以做很多事情。只是一个想法,可能不是您想要的。

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")
    }   
}


 类似资料:
  • 我无法访问静态内容(angular app),甚至无法访问简单的索引。来自spring boot的html文件。我一直收到404错误。Spring没有为我提供这些静态文件。自从升级到Spring Boot 2.2.4后,我就遇到了这个问题。我必须升级以应对Zip64问题。 我的application.properties里有这样一句话: 我也有自己的staticResourceConfigurat

  • 问题内容: 我正在尝试: 但是它继续提供我static_path中拥有的服务(如上所述,我在两个单独的路径中有两个不同的,但是我希望能够覆盖)。 问题答案: 从应用程序设置中删除。 然后将您的处理程序设置为:

  • 问题内容: 我使用Flask并想更改资产文件夹目录。这是我的文件夹结构: 我想将静态文件夹下的所有文件夹移到该文件夹下。但是当我这样做时,我的css文件和其他文件无法加载页面。我应该为我的应用程序设置一个属性吗?我也尝试了以下方法: 但是无法做到这一点,还有其他方法吗? 更新: 当我在上方的行中删除前导斜杠时,出现了 带有追溯的错误: 问题答案: 初始化应用程序时,它应该是static_folde

  • 问题内容: 我有一个关于在Go中提供文件的快速问题。有一个省时的FileServer处理程序,但是对于我的用例来说,我的应用程序只有2或3个文件(js和css),我不想使部署复杂化而不得不考虑这些问题。 您是否认为有一种简单的方法可以将这两个文件构建为二进制文件并从那里提供文件。例如,base64将文件的数据编码为常量,然后从常量中存储文件。这将以最简单的形式工作,但是我不想自己做文件服务器所做的

  • 问题内容: 我无法让Spring-boot项目提供静态内容。 我已经放在一个命名的文件夹下。在其中,我有一个名为的文件夹。当我打包应用程序并运行它时,它找不到我放在该文件夹中的图像。 我试图把静态文件中,并但没有任何工程。 如果我我可以看到文件在正确文件夹的jar中:例如,但是调用:http://localhost:8080/images/head.png,我得到的只是一个404 有什么想法为什么

  • 我正在通过spring boot启动一个嵌入式tomcat,并希望提供一个静态索引。html页面作为正在运行的应用程序的一部分。 但以下方法不起作用: 结果:当我调用localhost:8080时,我只看到单词“index”,而没有看到我的html页面。为什么?