无论如何,使用 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: /
这造成了一些奇怪的行为。
- 在
/client
上,仍然是同样的问题,但无法在任何位置找到 /static
文件(例如,/client/static
、/static
等。 )
- 在
/api
上,有或没有 FORCE_SCRIPT_NAME
都无法让它提供任何服务。入口正在进入 Django,但说它无法匹配任何路由,这非常奇怪。
在你的入口定义中使用重写注释,我认为在你的情况下它会是这样的:
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
我已经为此工作了一段时间,但似乎一无所获。
基本上,我有一个微服务的入口控制器,它的 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: /
这造成了一些奇怪的行为。
- 在
/client
上,仍然是同样的问题,但无法在任何位置找到/static
文件(例如,/client/static
、/static
等。 ) - 在
/api
上,有或没有FORCE_SCRIPT_NAME
都无法让它提供任何服务。入口正在进入 Django,但说它无法匹配任何路由,这非常奇怪。
在你的入口定义中使用重写注释,我认为在你的情况下它会是这样的:
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