Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Golang web服务器不提供静态文件_Go_Webserver_Http Status Code 404_Static Files - Fatal编程技术网

Golang web服务器不提供静态文件

Golang web服务器不提供静态文件,go,webserver,http-status-code-404,static-files,Go,Webserver,Http Status Code 404,Static Files,我相当肯定我忽略了一些显而易见的事情,但我不确定是什么。我正在构建一个简单的web应用程序,用于提供书籍的模板页面。模板工作正常,图像的路径似乎填充正确,但图像本身一直出现404错误 以下是模板: 图像存储在可执行文件所在目录正下方的images子目录中。当我试图在页面中查看损坏的图像时,路径显示为localhost:8080/images/[imagename],但给出了404错误。我在这里缺少什么配置或路由选项?您创建的路由不正确,无法为图像服务。Router.Handle()方法将URL

我相当肯定我忽略了一些显而易见的事情,但我不确定是什么。我正在构建一个简单的web应用程序,用于提供书籍的模板页面。模板工作正常,图像的路径似乎填充正确,但图像本身一直出现404错误

以下是模板:


图像存储在可执行文件所在目录正下方的
images
子目录中。当我试图在页面中查看损坏的图像时,路径显示为
localhost:8080/images/[imagename]
,但给出了404错误。我在这里缺少什么配置或路由选项?

您创建的路由不正确,无法为图像服务。
Router.Handle()
方法将URL与匹配整个路径的
Path()
matcher匹配,而实际上您希望匹配以“/image/”开头的任何路径。相反,使用
路径前缀()
匹配器创建路由:

var imgServer = http.FileServer(http.Dir("./images/"))
router.PathPrefix("/images/").Handler(http.StripPrefix("/images/", imgServer))

有关更多信息,请参阅。

几乎可以肯定,您将错误的路径传递到
http.Dir
。为什么
。/
?您正在从子目录执行服务器吗?根据您的描述,我希望您需要
/images/
。@Flimzy您是正确的,应该是
/images/
,但是问题仍然存在。我们不知道您的目录结构和如何启动服务器,但这些答案包含解决方案:;这实际上取决于执行二进制文件时,图像相对于工作目录的位置。另一种方法是使用配置值(来自配置文件、env var或CLI标志)传入可以找到内容文件的根路径,并使用该路径而不是相对路径。什么是
github.com/user/marketplace/typelibrary
package main
import (
    "html/template"
    "log"
    "net/http"
    "time"

    "github.com/gorilla/mux"
    "github.com/user/marketplace/typelibrary"
)

var books []typelibrary.Book

func ItemHandler(w http.ResponseWriter, r *http.Request) {
    params := mux.Vars(r)
    var selected typelibrary.Book       
    //Retrieve item data
    for _, item := range books {
        if item.ID == params["id"] {
            selected = item
            break
        }
    }
    t, _ := template.ParseFiles("./templates/book.html")
    t.Execute(w, selected)
}

func main() {
    router := mux.NewRouter()
    books = append(books, typelibrary.Book{ID: "1", Title: "The Fellowship of the Ring", ImageURI: "LotR-FotR.jpg", Author: &typelibrary.Author{Name: "JRR Tolkien"}})
    books = append(books, typelibrary.Book{ID: "2", Title: "The Two Towers", ImageURI: "LotR-tTT.jpg", Author: &typelibrary.Author{Name: "JRR Tolkien"}})
    books = append(books, typelibrary.Book{ID: "3", Title: "The Return of the King", ImageURI: "LotR-RotK.jpg", Author: &typelibrary.Author{Name: "JRR Tolkien"}})
    books = append(books, typelibrary.Book{ID: "4", Title: "Monster Hunter International", ImageURI: "MHI1.jpg", Author: &typelibrary.Author{Name: "Larry Correia"}})

    router.Handle("/", http.FileServer(http.Dir(".")))
    router.Handle("/images/", http.FileServer(http.Dir("../images/")))
    router.HandleFunc("/item/{id}", ItemHandler).Methods("GET")

    srv := &http.Server{
        Handler:      router,
        Addr:         ":8080",
        WriteTimeout: 10 * time.Second,
        ReadTimeout:  10 * time.Second,
    }
    log.Fatal(srv.ListenAndServe())
}
var imgServer = http.FileServer(http.Dir("./images/"))
router.PathPrefix("/images/").Handler(http.StripPrefix("/images/", imgServer))