用Ingress在Kubernetes中重写URL

问题描述

我正在将旧网站迁移到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

Try1:

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

看起来我必须在我的应用程序中做些什么,但是我们不能在不更改应用程序代码的情况下在入口中做些什么吗?

更新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

解决方法

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

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.

✌️

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...