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

Golang Gorilla Mux与http.FileServer返回404

杨高翰
2023-03-14
问题内容

我看到的问题是我正在尝试http.FileServer将Gorilla mux Router.Handle函数与一起使用。

这不起作用(图像返回404)。

myRouter := mux.NewRouter()
myRouter.Handle("/images/", http.StripPrefix("/images/", http.FileServer(http.Dir(HomeFolder + "images/"))))

这有效(图像显示正常)。

http.Handle("/images/", http.StripPrefix("/images/", http.FileServer(http.Dir(HomeFolder + "images/"))))

下面简单的转到Web服务器程序,显示问题…

package main

import (
    "fmt"
    "net/http"
    "io"
    "log"
    "github.com/gorilla/mux"
)

const (
    HomeFolder = "/root/test/"
)

func HomeHandler(w http.ResponseWriter, req *http.Request) {
    io.WriteString(w, htmlContents)
}

func main() {

    myRouter := mux.NewRouter()
    myRouter.HandleFunc("/", HomeHandler)
    //
    // The next line, the image route handler results in 
    // the test.png image returning a 404.
    // myRouter.Handle("/images/", http.StripPrefix("/images/", http.FileServer(http.Dir(HomeFolder + "images/"))))
    //
    myRouter.Host("mydomain.com")
    http.Handle("/", myRouter)

    // This method of setting the image route handler works fine.
    // test.png is shown ok.
    http.Handle("/images/", http.StripPrefix("/images/", http.FileServer(http.Dir(HomeFolder + "images/"))))

    // HTTP - port 80
    err := http.ListenAndServe(":80", nil)

    if err != nil {
        log.Fatal("ListenAndServe: ", err)
        fmt.Printf("ListenAndServe:%s\n", err.Error())
    }
}

const htmlContents = `<!DOCTYPE HTML>
<html lang="en">
  <head>
    <title>Test page</title>
    <meta charset = "UTF-8" />
  </head>
  <body>
    <p align="center">
        <img src="/images/test.png" height="640" width="480">
    </p>
  </body>
</html>
`

问题答案:

我将其发布在golang-nuts讨论组上,并 从
ToniCárdenas获得了此解决方案 …

标准的net / http ServeMux(这是您在使用时使用的标准处理程序http.Handle)和多路复用器路由器具有不同的地址匹配方式。

查看http://golang.org/pkg/net/http/#ServeMux和http://godoc.org/github.com/gorilla/mux之间的区别。

因此,基本上,http.Handle('/images/', ...)匹配“ / images /
whatever”,而myRouter.Handle('/images/', ...) 匹配“ / images /”,如果要处理“ /
images / whatever”,则必须…

选项1- 在路由器中使用正则表达式匹配

myRouter.Handle("/images/{rest}",
     http.StripPrefix("/images/", http.FileServer(http.Dir(HomeFolder + "images/"))))

选项2- 在路由器上使用PathPrefix方法:

myRouter.PathPrefix("/images/").Handler(http.StripPrefix("/images/", 
     http.FileServer(http.Dir(HomeFolder + "images/"))))


 类似资料:
  • 问题内容: 我有一个如下定义的可连接pthread运行器函数: 该线程应该加入主线程。 每当我通过Valgrind运行程序时,都会出现 以下泄漏 : 我检查了手册页中的pthread,其中说: 奇迹般地,当我用return语句替换pthread_exit()时, 泄漏消失了 。 我的实际问题有三点: 有人可以解释为什么return语句没有泄漏吗? 相对于从线程退出,两个语句之间是否存在一些根本区别

  • 问题内容: 当我想阻止其他事件处理程序在某个事件被触发后执行时,可以使用两种技术之一。我将在示例中使用jQuery,但这也适用于纯JS: 1。 2。 这两种停止事件传播的方法之间是否有显着差异? 对我来说,比执行方法更简单,更短并且更容易出错。使用该方法时,您必须记住正确的大小写,括号等。 另外,我必须在回调中定义第一个参数才能调用该方法。也许,出于某些原因,我应该避免这样做并改为使用它?有什么更

  • 问题内容: 我想知道是否和相同。 例如,如果事件处理程序是使用旧模型添加的 }; 然后,阻止默认操作,例如。 如果事件处理程序使用添加,例如 ); 然后,不要阻止默认操作。 所有浏览器的行为都一样吗? 和之间还有更多区别吗? 在哪里可以找到一些有关行为的文档(我在MDN中找不到)? 问题答案: 的W3C文档对象模型事件规范在 _1.3.1。 事件注册接口_指出,EventListener中没有返回

  • 更新 我已经读了十几篇关于这个话题的文章,但没有一篇涉及到这个基本问题。我将在本文末尾列出一个参考资料部分。 原始帖子 我对函数的理解是,它返回一个promise。 MDN文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function 在我的程序中,我可以编写如下内容: 我

  • 问题内容: 例如我有一个功能: 我怎样才能返回AJAX后得到的? 问题答案: 因为请求是异步的,所以您无法返回ajax请求的结果(而同步ajax请求是一个 糟糕的 主意)。 最好的选择是将自己的回调传递给f1 然后,您将像这样致电:

  • 问题内容: 该方法返回的表示形式。这里返回的对象是数组支持的,但不是对象。 我正在寻找对象返回值与对象之间的差异- 一种快速的来源,可以告诉它们而无需深入研究代码。 TIA。 问题答案: 当您调用Arrays.asList时,它不会返回。它返回一个由原始源数组支持的固定大小列表。换句话说,它是使用Java的基于集合的API公开的数组的视图。 您不能向其中添加元素,也不能从中删除元素。如果您尝试从中