热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用gostatic文件服务器时如何自定义处理找不到的文件?

如何解决《使用gostatic文件服务器时如何自定义处理找不到的文件?》经验,为你挑选了1个好方法。

因此,我正在使用Go服务器来提供单个页面的Web应用程序。

这适用于服务根路由上的所有资产。所有CSS和HTML均已正确提供。

fs := http.FileServer(http.Dir("build"))
http.Handle("/", fs)

因此,当URL为http://myserverurl/index.html或时http://myserverurl/styles.css,它将提供相应的文件。

但是对于类似的URL http://myserverurl/myCustompage404如果myCustompage不是build文件夹中的文件,它将抛出。

如何使不存在文件的所有路由服务index.html

它是一个单页Web应用程序,一旦提供html和js,它将呈现适当的屏幕。但它需要index.html在没有文件的路由上提供。

如何才能做到这一点?



1> icza..:

返回的处理程序http.FileServer()不支持自定义,它不支持提供自定义404页面或操作。

我们可以做的是包装由返回的处理程序http.FileServer(),并且在我们的处理程序中我们当然可以做我们想做的任何事情。在包装处理程序中,我们将调用文件服务器处理程序,如果该处理程序将发送404未找到的响应,则不会将其发送给客户端,而是将其替换为重定向响应。

为此,我们在包装器中创建了一个包装器http.ResponseWriter,该包装器将传递给由返回的处理程序http.FileServer(),在该包装器响应编写器中,我们可以检查状态码,如果是404,我们可以采取行动将响应发送给客户端,而是将重定向发送到/index.html

这是一个示例,该包装器http.ResponseWriter可能如下所示:

type NotFoundRedirectRespWr struct {
    http.ResponseWriter // We embed http.ResponseWriter
    status              int
}

func (w *NotFoundRedirectRespWr) WriteHeader(status int) {
    w.status = status // Store the status for our own use
    if status != http.StatusNotFound {
        w.ResponseWriter.WriteHeader(status)
    }
}

func (w *NotFoundRedirectRespWr) Write(p []byte) (int, error) {
    if w.status != http.StatusNotFound {
        return w.ResponseWriter.Write(p)
    }
    return len(p), nil // Lie that we successfully written it
}

并包装返回的处理程序http.FileServer()可能如下所示:

func wrapHandler(h http.Handler) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        nfrw := &NotFoundRedirectRespWr{ResponseWriter: w}
        h.ServeHTTP(nfrw, r)
        if nfrw.status == 404 {
            log.Printf("Redirecting %s to index.html.", r.RequestURI)
            http.Redirect(w, r, "/index.html", http.StatusFound)
        }
    }
}

请注意,我使用的是http.StatusFound重定向状态代码,而不是http.StatusMovedPermanently后者,因为后者可能被浏览器缓存,因此,如果稍后创建具有该名称的文件,浏览器将不会请求它,而是index.html立即显示。

现在使用该main()功能:

func main() {
    fs := wrapHandler(http.FileServer(http.Dir(".")))
    http.HandleFunc("/", fs)
    panic(http.ListenAndServe(":8080", nil))
}

尝试查询不存在的文件,我们将在日志中看到以下内容:

2017/11/14 14:10:21 Redirecting /a.txt3 to /index.html.
2017/11/14 14:10:21 Redirecting /favicon.ico to /index.html.

请注意,我们的自定义处理程序(行为良好)还将请求重定向到/favico.icoindex.html因为favico.ico我的文件系统中没有文件。如果您也没有,可以将其添加为例外。

完整示例可在Go Playground上找到。您无法在此处运行它,将其保存到本地Go工作区中并在本地运行。

还要检查以下相关问题:在http.FileServer上登录404


推荐阅读
  • SoIveinstalledLAMPonanUbuntumachineforsomephpdevelopmentandeverythingisworkingfine ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 因此,我用C语言制作了一个Web服务器,该服务器显示传感器温度以及gnuplot以png格 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • asp中如何嵌入python的简单介绍
    本文目录一览:1、如何在IIS中执行Python脚本 ... [详细]
  • 如何解决《在哪里放我的PHP文件》经验,为你挑选了2个好方法。 ... [详细]
  • 如何解决《使用golangwebserver,网站的根目录在哪里映射到文件系统?》经验,为你挑选了1个好方法。 ... [详细]
  • Iminthemiddleofchangingourserver.Weboughtserverspaceatadifferentlocationandneedto ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
author-avatar
歪果仁
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有