使用 nginx 或 kukbernetes 入口在前面的 Web 应用程序中按路径路由



假设我拥有一个域名 xxx.yyy.com,但我不拥有它的任何子域名(*.xxx.yyy.com)。

所以我必须通过path将每个HTTP请求路由到其相应的服务。例如,将 xxx.yyy.com/app1/路由到服务app1,xxx.yyy.com/app2/路由到服务app2

我配置我的 kubernestes 资源如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: xxx.yyy.com
http:
paths:
- pathType: Prefix
path: "/app1"
backend:
service:
name: app1
port:
number: 8000
- pathType: Prefix
path: "/app2"
backend:
service:
name: app2
port:
number: 8000
---
apiVersion: v1
kind: Service
metadata:
name: app1
spec:
selector:
app: app1
ports:
- protocol: TCP
port: 8000
---
apiVersion: v1
kind: Service
metadata:
name: app2
spec:
selector:
app: app2
ports:
- protocol: TCP
port: 8000

这在大多数情况下都有效,除了前面的 Web 应用程序。

在前端 Web 应用程序的 HTML 和 JavaScript 代码中,我们通过根路径 ("/") 引用后端服务器上的资产(图像、HTTP API),就好像它部署在自己的服务器上一样。

例如在app1的 javascript 代码中,我们调用fetch('/api/getUsers')而不是fetch('/app1/api/getUsers'),因此入口无法将/api/getUsers路由到服务app1

我知道可以通过路由请求轻松解决host而不是path.但我没有创建子域的权限。

那么,如何通过入口路由来解决前端 Web 应用程序的path场景呢?

当 Web 应用程序可用于某个路径下的浏览器时,前端请求需要以该路径为目标。您可以通过以下方式实现此目的

  • 仅使用相对路径名(如api/guestUsers)而不是/api/guestUsers
  • 或者在每个查询 URL 前面加上该路径,例如/app1/img/logo.png.

第二种方式由以下机构支持,例如:

  • 网络包:publicPath: "/app1"
  • 反应路由器:<BrowserRouter basename="/app1"/>
  • 角度:<base href="/app1"/>

此设置可以用服务器变量动态填充,甚至可以自动设置为入口点的位置。

在应用程序中,使用window.location.href并解析 URL 的第一部分,并将其用作请求的基础。

const url = new URL(window.location.href);
const appName = url.pathname.split('/').length > 2 ?  url.pathname.split('/')[1] : "";
const baseApiUrl = new URL(appName, url).toString();
fetch(baseApiUrl + '/api/getUsers')
.then((res) = {})
.catch((error) => { console.log(error)})

相关内容

  • 没有找到相关文章

最新更新