【问题标题】:nginx ingress sub path redirectionnginx入口子路径重定向
【发布时间】:2019-04-04 23:16:47
【问题描述】:

我有一个入口控制器和入口资源运行,所有 /devops 都映射到后端的 devopsservice。当我尝试点击“http://hostname/devops”时,一切正常,我得到一个带有一组超链接的页面(尽管没有 CSS 和样式),例如其中一个是“日志”。

当我点击“日志”超链接时,它会将我重定向到http://hostname/logs,而我需要它是http://hostname/devops/logs

知道我能做什么吗?

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
 name: my-ingress
 namespace: ingress-nginx
 annotations:
   kubernetes.io/ingress.class: nginx
   nginx.ingress.kubernetes.io/rewrite-target: /
   nginx.ingress.kubernetes.io/add-base-url : "true"
spec:
 rules:
 - host: master1.dev.local
   http:
     paths:
     - backend:
         serviceName: devops1
         servicePort: 10311
       path: /devops

【问题讨论】:

  • add-base-url 在 0.22.0 中是 removed
  • 你解决了css问题吗?

标签: nginx kubernetes kubernetes-ingress nginx-ingress


【解决方案1】:

您的入口似乎没有提供任何服务 /devops/*。尝试使用相同的后端添加另一个路径/devops/*。基本上是这样的:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
 name: my-ingress
 namespace: ingress-nginx
 annotations:
   kubernetes.io/ingress.class: nginx
   nginx.ingress.kubernetes.io/rewrite-target: /
   nginx.ingress.kubernetes.io/add-base-url : "true"
spec:
 rules:
 - host: master1.dev.local
   http:
     paths:
     - backend:
         serviceName: devops1
         servicePort: 10311
       path: /devops/*
     - backend:
         serviceName: devops1
         servicePort: 10311
       path: /devops

更新:上面已经deprecated 支持这样的事情:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  name: rewrite
  namespace: default
spec:
  rules:
  - host: master1.dev.local
    http:
      paths:
      - backend:
          serviceName: devops1
          servicePort: 10311
        path: /devops(/|$)(.*)

【讨论】:

  • add-base-url 在 0.22.0 中是 removed
【解决方案2】:

如果您直接从浏览器访问http://hostname/devops/logs,您肯定会得到您想要的。但是既然你点击首页的超链接,那么你只能得到http://hostname/logs,肯定会失败。

因此,您需要在入口 yaml 中配置 /logs 后端以对其进行处理,并配置 nginx.ingress.kubernetes.io/configuration-snippet 以确保 /logs 不会被重写,如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
 name: my-ingress
 namespace: ingress-nginx
 annotations:
   kubernetes.io/ingress.class: nginx
   nginx.ingress.kubernetes.io/rewrite-target: /
   nginx.ingress.kubernetes.io/add-base-url : "true"
   nginx.ingress.kubernetes.io/configuration-snippet: |
     rewrite ^/logs /logs break;
spec:
 rules:
 - host: master1.dev.local
   http:
     paths:
     - backend:
         serviceName: devops1
         servicePort: 10311
       path: /logs
     - backend:
         serviceName: devops1
         servicePort: 10311
       path: /devops

【讨论】:

  • add-base-url 在 0.22.0 中是 removed
【解决方案3】:

我最近遇到了类似的问题。

假设您的 html 中的“日志”超链接使用相对路径,这意味着超链接不以“/”开头,那么我认为您可以尝试访问 http://hostname/devops/ 的页面http://hostname/devops。 (注意第一个网址中的 / 后缀。)。

然后“日志”超链接将形成为 http://hostname/devops/logs。

我认为这与浏览器如何识别“基本”网址有关。访问 'http://hostname/devops/ 时,如果 html 标头中没有 'base' 标签,则 'base' url 将被计算为 http://hostname/devops;而使用“http://hostname/devops”时,基本 url 将是 http://hostname。

如果不是这样,请在https://github.com/kubernetes/ingress-nginx/issues/4149 进行讨论。建议使用带有 configuration-sn-p 的 nginx 指令 subs_filter 来使 href 属性相对,并在 html 标头中添加 base 标记。

使用的入口如下,

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  name: rewrite
  namespace: default
spec:
  rules:
  - host: master1.dev.local
    http:
      paths:
      - backend:
          serviceName: devops1
          servicePort: 10311
        path: /devops(/|$)(.*)

【讨论】:

    【解决方案4】:

    nginx.ingress.kubernetes.io/x-forwarded-prefixannotation 可用于此目的。

    它将x-forwarded-prefix 标头添加到带有此注释的值的http 请求。如果您的后端支持此类标头,您可以使用它。

    例如,Spring Boot 应用程序可以通过使用属性来处理它:

    server.forward-headers-strategy=framework
    

    在您的情况下,入口如下所示:

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
     name: my-ingress
     namespace: ingress-nginx
     annotations:
       kubernetes.io/ingress.class: nginx
       nginx.ingress.kubernetes.io/rewrite-target: /
       nginx.ingress.kubernetes.io/x-forwarded-prefix: /devops
    spec:
     rules:
     - host: master1.dev.local
       http:
         paths:
         - backend:
             serviceName: devops1
             servicePort: 10311
           path: /devops
    

    此解决方案有其缺点。它迫使您在单独的入口中声明每个服务。

    【讨论】:

      猜你喜欢
      • 2020-12-30
      • 1970-01-01
      • 2022-01-11
      • 2013-06-29
      • 2018-05-23
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多