为了账号安全,请及时绑定邮箱和手机立即绑定

Golang Goji:如何同时提供静态内容和api

Golang Goji:如何同时提供静态内容和api

Go
茅侃侃 2021-08-23 15:52:51
过去两周我一直在玩 Golang,终于可以使一个真正的应用程序工作。它使用 NGINX 提供的静态 HTML 文件,API 使用 Goji Web 框架作为后端。我不使用任何 Golang 模板,因为一切都是 Angular.Js,所以 static 可以满足我的需要。我希望可以选择是在生产中使用 NGINX 还是让 Go 使用应用程序使用的相同端口(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 configurationlocation / {    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;}}
查看完整描述

2 回答

?
翻阅古今

TA贡献1780条经验 获得超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()

}


查看完整回答
反对 回复 2021-08-23
?
慕村225694

TA贡献1880条经验 获得超4个赞

如果您可以完全控制您的 URL,一个简单的策略是在顶层划分它们。我/a在所有应用程序 URL/s的开头和所有静态 URL 的开头使用。这使得路由非常简单。

我用了一段时间 Goji,然后切换到 Gocraft-web。但原则是相同的,因为 URL 对任何一个框架都是明确的。Gocraft-web 显然可以做子路由;我认为 Goji 也可以这样做,但不太明显。子路由之所以有用,有以下几个原因:

  • 这是消除歧义的简单方法

  • 如果路由器的搜索模式更简单,它可能会更快

  • 你可以分割你的代码,这样可能更容易理解

如果您在生产中提供静态资产,您可能希望对其进行测量并提高其性能。我发现预压缩 (gzip) 我的 JS 和 CSS 文件可以提供帮助。我在同一个文件系统中有未压缩和压缩版本,并且我有一个定制的静态资产包,可以发现预压缩文件并将它们提供给所有理解的客户端(几乎所有浏览器)。此外,设定未来的到期日也值得探讨。这两个想法都内置在 Nginx 中,只需付出一点努力就可以很容易地编写代码。


查看完整回答
反对 回复 2021-08-23
  • 2 回答
  • 0 关注
  • 242 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信