【问题标题】:Anyway to serve /static from a prefixed URL (e.g. /client/static) with npm start?无论如何使用 npm start 从前缀 URL(例如 /client/static)提供 /static 服务?
【发布时间】:2020-05-06 23:39:02
【问题描述】:

我已经为此工作了一段时间,但似乎无处可去。

基本上,我有一个微服务的入口控制器,其 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: /$1
  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: /$2

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

  • /client上,还是同样的问题,但是在任何位置都找不到/static文件(例如/client/static/static等)
  • /api 上,无论有没有FORCE_SCRIPT_NAME,它都无法提供任何服务。入口正在进入 Django,但说它无法匹配任何路由,这非常奇怪。

【问题讨论】:

    标签: reactjs docker kubernetes create-react-app nginx-ingress


    【解决方案1】:

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

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

    $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/$2
      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
    

    【讨论】:

    • 感谢您的帮助;但是,仍然遇到同样的问题。我已经更新了我原来的问题。
    • 尝试在入口中将 /​​client/?(.*) 替换为 /client(/|$)(.*)
    • 好的,我现在的行为就像我现在对 $1/?(.*) 所做的那样。尽管如此,客户端仍然没有提供服务,因为资产仍在尝试从 /client/static 提供服务。
    • 尝试添加下一个注解: nginx.ingress.kubernetes.io/configuration-sn-p : rewrite_log on;在此之后,检查 nginx 控制器 pod 的日志,您应该会看到“重写数据”部分,这可能会给您提供问题的线索
    猜你喜欢
    • 2013-12-09
    • 2011-07-28
    • 1970-01-01
    • 2012-12-15
    • 2015-09-30
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多