在不同位置提供静态文件

时间:2016-06-22 23:31:22

标签: http go

我正在编写一个Go应用程序,它在两个不同的目录中提供文件。

我的项目结构:

PROJECT_DIR
PROJECT_DIR/config
PROJECT_DIR/src
PROJECT_DIR/client
PROJECT_DIR/client/node_modules
PROJECT_DIR/client/www

在我的主go文件中,我使用以下代码启动文件服务器:

func main() {
log.Print("started web server...");
httpsPortStr := ":" + strconv.FormatUint(config.CfgIni.HttpsPort, 10)
log.Printf("starting https web server at port %v", config.CfgIni.HttpsPort)
http.Handle("/", http.FileServer(http.Dir("client/www")))
http.Handle("/node_modules",http.FileServer(http.Dir(("client/node_modules"))))
err := http.ListenAndServeTLS(httpsPortStr, config.CfgIni.CertificateFile, config.CfgIni.PrivateKeyFile, nil)
if err != nil {
    log.Fatalf("https server stopped with the following error: %v", err)
} else {
    log.Print("https server stopped with no error")
}
}

如您所见,我将/映射到client / www和/node_modules映射到client / node_modules。

当我尝试访问客户端/ www上的文件时,例如https://host:port/test.html,它效果很好!

当我尝试访问client / node_modules上的文件时,例如:https://host:port/node_modules/test.html,我找不到404页面。

test.html文件存在于两个位置且可读(无权限问题)。

我可能会以某种方式错误地配置路由。

任何想法?

谢谢!

1 个答案:

答案 0 :(得分:0)

FileServer正在尝试将路径(例如/ node_modules / ...)路由到文件“client / node_modules / node_modules /..."

所以请使用StripPrefix,例如:

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

在此处查看另一个answer