http.ServeFile返回服务器golang上的404未找到错误

http.ServeFile返回服务器golang上的404未找到错误,go,supervisord,Go,Supervisord,我的go web应用程序中有以下处理程序: func pleaseLoginHandler(w http.ResponseWriter, req *http.Request) { http.ServeFile(w, req, "./pleaselogin.html") } 此处理程序是为路由http://a.b.org/pleaselogin通过使用: rtr.HandleFunc("/pleaselogin", pleaseLoginHandler) 应用程序在本地运行时没有任何问

我的go web应用程序中有以下处理程序:

func pleaseLoginHandler(w http.ResponseWriter, req *http.Request) {
    http.ServeFile(w, req, "./pleaselogin.html")
}
此处理程序是为路由
http://a.b.org/pleaselogin
通过使用:

rtr.HandleFunc("/pleaselogin", pleaseLoginHandler)
应用程序在本地运行时没有任何问题。此外,如果我从包含所有应用程序文件的文件夹中运行可执行文件,它也可以在远程服务器上运行。也就是说,如果应用程序位于
/home/username/go/src/appdirectory/appexecfile
位置,并且我通过转到该目录并以
/appexecfile
的形式启动应用程序,则所有路由都会按预期工作

当我使用
supervisords
启动应用程序时,就会出现问题。在这种情况下,如果我访问路线
http://a.b.org/pleaselogin
服务器返回404未找到错误。我猜这是因为http.ServeFile使用的是相对路径,当应用程序以
supervisord
启动时,它不知道如何在
/home/user/go/src/appdirectory
中查找该文件

有人能提出解决这个问题的办法吗?我可以使用另一种方法在golang应用程序中提供文件以避免此问题吗?或者,我可以使用
supervisord
中的设置来查找与应用程序可执行文件相关的任何文件吗


谢谢。

好的,我想我可以在
supervisord
配置中添加目录选项。加上

directory=/home/username/go/src/appdirectory/

解决了这个问题。但是,如果还有其他更好的解决方案,我很乐意看到它们。

是:不要在应用程序中使用相对路径!将静态文件的路径作为配置选项传递(例如,使用),如果未设置,则返回结果
os.Getwd
(或退出)。要明确,因为正如你所发现的,一旦你在另一台机器上,依赖“隐式”行为会很快失效。@elithrar你能举个例子吗?不清楚你的建议是什么。我有一个文件夹,我直接从中使用
fs:=http.StripPrefix(“/static/”),http.FileServer(http.Dir(“/static”))
提供静态文件。但是,我不知道如何使用它将
http.ServeFile(w,req,“./plesselogin.html”)
转换为绝对路径。如果你能给我举个例子,我很乐意接受这个答案。
/static
是一个相对路径。让应用程序获取一个传递完整路径的参数/config文件/environment变量,例如
/Users/you/code/static/
,这样应用程序就可以找到静态目录,而不管它从哪里运行。Supervisord还允许您设置环境变量。@elithrar谢谢!现在我明白了。在这种情况下,我必须为dev和prod环境维护单独的值(因为每种情况下的完整路径不同)。但是,我可以在启动进程时使用适当的标志来指定这些路径,并让应用程序使用它们。相关:1;2.