nginx 入口子路径重定向

问题描述 投票:0回答:5

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

当我单击“日志”超链接时,它会将我重定向到 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
nginx kubernetes kubernetes-ingress nginx-ingress
5个回答
12
投票

看起来您的入口没有提供任何服务

/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

更新:上面的内容已被弃用,取而代之的是这样的:

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(/|$)(.*)

6
投票

如果您直接从浏览器访问

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

2
投票

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

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

然后“logs”超链接将形成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进行讨论。建议使用带有配置片段的 nginx 指令 subs_filter 来使 href 属性相对,并在 html 标头中添加基本标签。

使用的入口如下,

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(/|$)(.*)
    

1
投票

nginx.ingress.kubernetes.io/x-forwarded-prefix

 
注释 可用于此目的。

它将

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
这个解决方案有其缺点。它迫使您在单独的入口中声明每个服务。


0
投票
这方面有什么更新吗?这个问题解决了吗

© www.soinside.com 2019 - 2024. All rights reserved.