过去两周我一直在玩Golang,最后可以开始真正的应用程序。它使用NGINX提供的静态HTML文件,API使用Goji Web Framework作为后端。我不使用任何Golang模板,因为一切都是Angular.Js,所以静态可以满足我的需求。
我希望可以选择是否在生产中使用NGINX,或者让Go使用应用程序使用的相同端口在root上提供静态内容(8000)。这样开发环境就不需要安装NGINX。
所以,尝试像这样添加一个默认多路复用器的句柄
goji.DefaultMux.Handle("/*", serveStatic)
func serveStatic(w http.ResponseWriter, r *http.Request) {
//http.ServeFile(w, r, r.URL.Path[1:])
//http.FileServer(http.Dir("static"))
http.StripPrefix("/static/", http.FileServer(http.Dir("static")))
}
此句柄在所有API路径注册后执行(否则API无效)。
我已经尝试过任何类型的组合,它将我重定向到HTTP 404,或者将HTML内容显示为文本。两者都不好。我想知道是否有人来过这里,并且可以让我了解我做错了什么。
感谢。
虽然这与我的问题无关,但这里是我正在使用的NGINX配置:
server {
listen 80;
# enable gzip compression
gzip on;
gzip_min_length 1100;
gzip_buffers 4 32k;
gzip_types text/plain application/x-javascript text/xml text/css;
gzip_vary on;
# end gzip configuration
location / {
root /home/mleyzaola/go/src/bitbucket.org/mauleyzaola/goerp/static;
try_files $uri $uri/ /index.html = 404;
}
location /api {
proxy_pass http://localhost:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
答案 0 :(得分:5)
我遇到了类似的问题,所以也许以下几点会有所帮助。
请记住将服务静态内容的处理程序注册为最终路由。否则,它可能会匹配所有内容。
也许尝试使用绝对路径而不是相对路径。
这是我用Goji设置路线的简化版本。
func apiExampleHandler(context web.C, resp http.ResponseWriter, req *http.Request) {
fmt.Fprint(resp, "You've hit the API!")
}
func main() {
goji.Handle("/api", apiExampleHandler)
// Static file handler should generally be the last handler registered. Otherwise, it'll match every path.
// Be sure to use an absolute path.
staticFilesLocation := "Some absolute to the directory with your static content."
goji.Handle("/*", http.FileServer(http.Dir(staticFilesLocation)))
goji.Serve()
}
我使用示例项目创建了以下GitHub存储库。我可以访问静态内容和API。
答案 1 :(得分:2)
如果您可以完全控制自己的网址,那么一个简单的策略就是将它们划分到顶层。我在所有应用程序URL的开头使用/a
,在所有静态URL的开头使用/s
。这使得路由非常简单。
我正在使用Goji一段时间,然后切换到Gocraft-web。但原则是相同的,因为URL将与任一框架明确无关。 Gocraft-web显然可以进行子路由;我认为Goji也可以做到这一点但不太明显。 Subrouting有几个原因:
如果您在生产中提供静态资产,您可能希望测量它并改善其性能。我发现预压缩(gzip)我的JS和CSS文件可以提供帮助。我在同一个文件系统中都有未压缩和压缩的版本,我有一个定制的静态资产包,可以发现预压缩文件,并将它们提供给所有理解的客户端(几乎所有浏览器)。此外,设定未来的到期日期值得探讨。这两个想法都内置于Nginx中,并且通过一些努力很容易编写代码。