【问题标题】:Rewrite URL in Kubernetes with Ingress在 Kubernetes 中使用 Ingress 重写 URL
【发布时间】:2020-08-14 14:51:46
【问题描述】:

我正在将旧网站迁移到 Kubernetes,这些网站正在使用 www.app1.com、www.app2.com、 等 URL。

由于所有这些都部署在一个 K8s 集群中,所以我想使用像 www.myapp.com/app1 这样的 URL。但是当我访问 www.myapp.com/app1 时,它会路由到 www.myapp.com/login 而不是 www.myapp.com/app1/login

试一试:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
  name: rewrite
spec:
  rules:
  - host: www.myapp.com
    http:
      paths:
      - backend:
          serviceName: http-svc
          servicePort: 80
        path: /app1/?(.*)

我尝试了路径:/app1(.*),但它总是这样路由:

Try2:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/configuration-snippet: rewrite ^(/app1)$ $1/ permanent;
  name: rewrite
spec:
  rules:
  - host: www.myapp.com
    http:
      paths:
      - backend:
          serviceName: http-svc
          servicePort: 80
        path: /app1(/|$)(.*)

这让我进入了登录页面,但页面上的所有 URL 仍然有 www.myapp.com/page1 或 www.myapp.com/page2 之类的 URL,而不是 www.myapp.com/app1/page1 或 www.myapp.com/app1/page2.

看起来我必须在我的应用程序中做一些事情,但我们不能在不更改应用程序代码的情况下在 ingress 中做一些事情吗?

更新1: 入口日志: 在浏览器中,当我访问 www.myapp.com/app1 时,它会打印以下日志

[13/Aug/2020:21:19:25 +0000] "GET /app1 HTTP/2.0" 303 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36" 503 0.005 [my-ns-http-svc-80] [] x.x.x.x:80 5 0.005 303 d5da4ff09ee26c83fe67519c98f5eb50

在浏览器中它给出 404 错误,在 URL 栏中 URL 是 www.myapp.com/login

【问题讨论】:

  • 你可以试试 /app1/(.+) 吗?
  • @Rohit 没有改善,结果相同
  • 试试这个网站的选项。我自己没有尝试过。 linuxrecruit.co.uk/…
  • 你为什么不保留以前的主机名呢?
  • @BogdanL 现在我们要公开这种方式

标签: kubernetes kubernetes-ingress nginx-ingress


【解决方案1】:

您的应用中似乎正在发生以下重定向:

www.myapp.com/app1➡️www.myapp.com/app1/login

因此,如果您希望 Ingress 资源中的行为相同,则必须删除 nginx.ingress.kubernetes.io/rewrite-target: 注释。

然后在你的路径上,你可以有这样的东西:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: rewrite
spec:
  rules:
  - host: www.myapp.com
    http:
      paths:
      - backend:
          serviceName: http-svc
          servicePort: 80
        path: /app1 ? Handles the initial request
      - backend:
          serviceName: http-svc
          servicePort: 80
        path: /app1/.* ? Handles the redirect your app is doing.

✌️

【讨论】:

  • 我的回答是假设你想点击www.myapp.com/app1/login 而不是www.myapp.com/login 是哪一个?
  • 是的,正确我想点击 www.myapp.com/app1/login 但是当我访问 www.myapp.com/app1 它重定向到 www.myapp.com/login 而不是 www.myapp .com/app1/login
  • 但是在 update1 中你说你正在点击www.myapp.com/login
  • "当我访问 www.myapp.com/app1 时,它会重定向到 www.myapp.com/login" 该重定向似乎来自应用程序本身,因此您可能需要让它知道路径中额外的/app1。
  • 或者您想点击www.myapp.com/app1 并神奇地让它与www.myapp.com/login 一起工作?那是行不通的(除非你修改你的应用程序)另外,当你使用app2 时会发生什么?您最好将域 www.myapp1.com 和 www.myapp2.com 分开。
猜你喜欢
  • 2019-05-03
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多