我有一个Go服务器,其中有一个API和一个带有SPA(单页应用程序)的静态客户端build
文件夹。由于SPA应该有客户端路由,我必须确保所有路径都映射到前端。例如,http://myapp.com/djaksfjal
不应在浏览器中显示404,它应始终路由到我的SPA中的路线。
现在我还想拥有一个后端API,因此/api
的所有请求都应该转到Go后端。
问题:如何使用AppEngine进行设置?我尝试了两个app.yaml
个文件和一个dispatch.yaml
文件,但无法让它工作。
客户端的app.yaml
runtime: go
api_version: go1
service: default
handlers:
- url: /
static_files: build/index.html
upload: build/index.html
- url: /*
static_dir: build
服务器-app.yaml中
runtime: go
api_version: go1
service: test-backend
handlers:
- url: /api/*
script: _go_app
dispatch.yaml
dispatch:
- url: "*/api/*"
service: test-backend
hello.go 包主要
import (
"fmt"
"net/http"
"google.golang.org/appengine"
)
func main() {
http.HandleFunc("/api/hello", handle)
appengine.Main()
}
func handle(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello, world!")
}
然后运行dev_appserver.py server-app.yaml client-app.yaml dispatch.yaml
并转到调度服务器所在的localhost:8080。但是,这不起作用。客户端路由接管所有内容,忽略/api/hello
路由。
经过测试:localhost:8080 / api / hello。 期待:api路由回复。 得到:静态客户回复
如果我将client-app.yaml
更改为不使用*
,则/api/hello
路由可以正常工作,但当然客户端路由不起作用,因为我需要 all < / em>路由到客户端,以便它可以自己处理路由(/api
路由除外)。
答案 0 :(得分:2)
dispatch.yaml
文件中的规则顺序很重要 - 第一个模式匹配获胜。所以你首先想要*/api
。
此外 - 如果规则模式都不匹配请求将是default
服务的路由器,则无需为此添加规则。
我还看到您提到了/api/hello
请求路径 - 要使其工作,您可能需要将*/api
模式扩展为*/api/*
所以我使用这个dispatch.yaml
文件:
dispatch:
- url: "*/api/*"
service: test-backend
您还需要展开{{1}}文件中的/api
模式,否则server-app.yaml
会提供404:
/api/hello
附注:您不应该(需要)转到handlers:
- url: /api/*
script: _go_app
- 这只会将您发送到默认服务。而是请注意开发服务器在服务器启动时显示的每个模块/服务所侦听的各个端口。