通过`html / template`提供动态HTML文件,同时还提供文件服务器,用于在同一目录中托管CSS,JS和图像文件

时间:2016-07-24 05:57:24

标签: go webserver fileserver

现在我有3个文件和一个文件夹在同一目录中,如下所示。 index.html会在.css文件夹中请求.js/img(ReactJS)和图片。

enter image description here

经过大量的搜索和尝试,我知道我可以使用以下内容创建文件服务器,以便为/内的文件提供client/index网址请求。

http.Handle("/", http.StripPrefix("/", http.FileServer(http.Dir("client/index"))))

效果很好。但它只提供静态文件,我希望在转出之前对html文件进行一些更改,例如修改标记<input id='projectId' type='hidden' value={{.projectId}}/>中的值。因此,我需要注册一个HandleFunc('/', handler)来执行html模板,但url /已经用于实现文件服务器。

在为文件系统(.css.js和文件夹img内的图像)提供文件系统请求的同时,动态修改html的正确方法是什么?

server / pghndler / index / index.go

package index

func RegisterHandlers() {
    http.Handle("/", http.StripPrefix("/", http.FileServer(http.Dir("client/index"))))
    http.HandleFunc("/login", loginHandler)
}

1 个答案:

答案 0 :(得分:1)

在我看来,最简单的方法(更少的代码)是假装你的静态文件在不同的目录中,比如说“静态”。这意味着您必须更改引用它们的html文件中的路径,即您所在的位置

<link rel="stylesheet" href="clent.css" type="text/css">

你用它替换它

<link rel="stylesheet" href="static/clent.css" type="text/css">

然后在您的服务器代码中,您可以拥有路径static的处理程序,并仍然使用/作为动态内容,即

func main() {
    http.HandleFunc("/", hh_root)
    http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("/home/Casper/public/client/index/"))))
    http.ListenAndServe(":8080", nil)
}

func hh_root(w http.ResponseWriter, r *http.Request) {
    // generate response from template
}

将网络资源组织到像“css”和“js”这样的目录中是很常见的,所以将它们用于虚假路径也许是有道理的 - 然后当你的应用程序增长并希望更好地组织它时,它更容易做到