无论如何,使用 npm start 从带前缀的 URL(例如 /client/static)服务 /static ?

Anyway to serve /static from a prefixed URL (e.g. /client/static) with npm start?

我已经为此工作了一段时间,但似乎一无所获。

基本上,我有一个微服务的入口控制器,它的 URL 为:

- path: /client/?(.*)
  backend:
    serviceName: client-cluster-ip-service
    servicePort: 3000

但是,当我导航到 192.168.64.4/client(这是 minikube ip)时,我没有看到任何东西,因为 URL npm start 用于静态文件是 /static。我需要将其更改为 /client/static

这可能吗?

我知道 homepage: "/client" 不是一个选项,因为它仅用于生产。这是在 CRA 中,所以我想避免弹出它。

编辑:

添加了我当前的 ingress.yaml:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
  name: ingress-service
  namespace: default
spec:
  rules:
    - http:
        paths:
          - path: /client/?(.*)
            backend:
              serviceName: client-cluster-ip-service
              servicePort: 3000
          - path: /api/?(.*)
            backend:
              serviceName: server-cluster-ip-service
              servicePort: 5000

/api 路由工作正常,因为 Django 有一个内置的方式来处理前缀路径。如果不这样做,它将无法正确提供 static 文件,特别是对于 admin 门户:

FORCED_SCRIPT_NAME = '/api'
STATIC_URL = '/api/static/'

ReactJS,显然正在开发。您可以手动导航到 /client/static/js/bungle.js 并在那里查看 .js。所以不知何故 /client 需要作为 /static/ 路径的前缀。

我确实尝试更改以下内容:

nginx.ingress.kubernetes.io/rewrite-target: /

这造成了一些奇怪的行为。

在你的入口定义中使用重写注释,我认为在你的情况下它会是这样的:

annotations:
  nginx.ingress.kubernetes.io/rewrite-target: /

$2 将替换为匹配项的捕获 (.*),然后如果您尝试访问 /client/static,结果重写将是 /static ...这在理论上应该可行,给它一个尝试! 如果这不起作用让我知道试图找出原因

我的资源也有一个类似的定义,与你的情况不完全一样,但我正在使用重写并且它在这里工作。

apiVersion: v1
kind: Ingress
metadata:
  name: proxy-ingress
  namespace: repoflow-s3-proxy-demo
annotations:
  nginx.ingress.kubernetes.io/rewrite-target: /resources.repoflow.com/resources/
  nginx.ingress.kubernetes.io/upstream-vhost: s3.amazonaws.com
spec:
  rules:
  - host: s3-proxy.repoflow.com
    http:
      paths:
        - path: /resources(/|$)(.*)
          backend:
            serviceName: resources-external-service
            servicePort: 80