nginx 入口重写目标问题与重定向

时间:2021-03-17 08:42:53

标签: kubernetes kubernetes-ingress nginx-ingress

我有一个 Kibana 仪表板,我目前通过主机的根目录访问它:https://my.host.com/。我想更改它,以便我可以通过路径 https://my.host.com/kibana/ 访问它。为此,我使用了 main documentation:

中提供的 rewrite-target 注释
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: kibana-ing
  annotations:
      nginx.ingress.kubernetes.io/rewrite-target: /$2
      kubernetes.io/ingress.class: kibana-ingress-class
      nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  rules:
    - host: my.host.com
      http:
        paths:
          - path: /kibana(/|$)(.*)
            backend:
              serviceName: kibana-svc
              servicePort: 5601

我认为这在某种程度上有效,因为当点击 https://my.host.com/kibana/ 时,我被重定向到登录页面。但是登录页面返回到我的浏览器时没有 kibana 前缀:https://my.host.com/app/login 并且我得到 404。

我该如何解决这个问题?

编辑:

这是当前我点击 https://my.host.com/kibana/ 时发生的情况:

enter image description here

这会发回 HTTP 302 并重定向到 app/login,如您在 Location 标头中所见。但是当我的浏览器要求 N​​ginx 获取这个应用程序/登录信息时,它理所当然地给出了 404,因为它不知道这个路径。

有没有办法(可能通过 Ingress 注释)将“/kibana”前缀附加到所有返回的 Location 标头?

EDIT2:

通过添加以下 2 个注释,我设法在 Location 标头中附加了 /kibana/ 部分:

nginx.ingress.kubernetes.io/proxy-redirect-from: "/"
nginx.ingress.kubernetes.io/proxy-redirect-to: "/kibana/"

这使重定向指向 kibana/app/login,从而导致 200 状态。然而,更多的对象正在被页面加载,比如 bootsrap.js,它们的位置被硬编码在 html 页面中,被发送回这样的:

</script><script src="/bootstrap.js"></script></body></html>

显然,这会在我的浏览器端返回另一个 404 错误......我想我将不得不在应用程序端处理这个问题。

1 个答案:

答案 0 :(得分:1)

我设法在应用程序级别解决了这个问题。在我的 kibana.yml 配置文件中,我必须告诉 Kibana 它在反向代理之后运行。所以我设置了 server.basePath: /kibana

请注意,我上面为 Ingress 所做的配置仍然需要,因为应用程序仍然可以在服务器的根目录访问,但只有响应 URL 将包含 /kibana/ 前缀。