Url rewriting kubernetes ingress nginx重写部分工作-有时错误的上下文路径

Url rewriting kubernetes ingress nginx重写部分工作-有时错误的上下文路径,url-rewriting,kubernetes-ingress,nginx-ingress,Url Rewriting,Kubernetes Ingress,Nginx Ingress,我正在使用GKE设置简单的Kubernetes集群。我已经将Java Spring boot应用程序设置为Kubernetes部署和服务(使用类型负载平衡器,在端口80上公开)。当直接使用外部IP访问该服务时,该应用程序运行良好 我还安装并提供了以下入口资源: apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: "nginx"

我正在使用GKE设置简单的Kubernetes集群。我已经将Java Spring boot应用程序设置为Kubernetes部署和服务(使用类型
负载平衡器
,在端口
80
上公开)。当直接使用外部IP访问该服务时,该应用程序运行良好

我还安装并提供了以下入口资源:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/enable-rewrite-log: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
  name: rewrite
  namespace: default
spec:
  rules:
  - host: "myhost.ddns.net"
    http:
      paths:
      - backend:
          serviceName: app-java
          servicePort: 80
        path: /app-java/?(.*)
从现在起,有趣的事情发生了:

问题1:如果我在
http://myhost.ddns.net/app-java
-我只得到HTML文件,所有其他资源都有
404
(从
http://myhost.ddns.net/foo.js
而不是
http://myhost.ddns.net/app-java/foo.js

问题2:如果我在
http://myhost.ddns.net/app-java/
-我得到了HTML文件以及所有脚本和图像。但是,当我深入挖掘时,通过POST发送表单内容失败。它的HTML代码是:

<form action="/select" method="post">
但是,我不知道如何将其转换为ingress资源yaml

如何使用入口修复此url重写问题


编辑:根据@HelloWorld的提示,我重新组织了应用程序,以在
/app java
上下文路径(使用Spring Boot 2属性
server.servlet.context path=/app java
)上提供内容。之后,我将
重写目标更改为:

nginx.ingress.kubernetes.io/rewrite-target: /app-java/$1

现在它工作正常。

我看到您正试图让浏览器为飞行中的所有路径添加前缀

我相信您一定误解了
X-Forwarded-Prefix
的概念,以及中所述的内容,其中社区成员介绍了如何将此标头传递给您的应用程序。如果您想尝试并了解其工作原理,只需将此注释添加到您的ingress对象即可:

nginx.ingress.kubernetes.io/x-forwarded-prefix: "/app-java"
nginx.ingress.kubernetes.io/configuration-snippet: |
    more_set_headers "X-Forwarded-Prefix: /app-java";
但请注意,这并不能解决您的问题

当然,您也可以将这些头添加到应用程序的响应中,以便将它们发送到您的浏览器(我相信您希望实现这一点),但浏览器并不关心这些头,因此这样做没有意义

如果您仍想亲自尝试并验证,可以将此注释添加到ingress对象:

nginx.ingress.kubernetes.io/x-forwarded-prefix: "/app-java"
nginx.ingress.kubernetes.io/configuration-snippet: |
    more_set_headers "X-Forwarded-Prefix: /app-java";
据我所知,解决这个问题的唯一方法是修改应用程序代码,使其以正确的路径响应


您可以发现,许多应用程序使用可自定义的基本路径,可以通过env变量、配置文件或cli参数进行配置。

非常感谢您的回答!我可以使我的应用程序在
/app java
上下文路径上运行。但是,我需要禁用URL重写,但要将路径映射到正确的后端。我将尝试执行此操作并发布我的解决方案!感谢您的帮助,它现在正在工作:)。我已经编辑了这个问题以包含修复。