如何在 nginx ingress 中保留浏览器 URL 的同时将 URL 重写到后端?

如何在 nginx ingress 中保留浏览器 URL 的同时将 URL 重写到后端?

我正在尝试重写服务路径,同时使用 kubernetes 上的 nginx ingress 保留浏览器 url。

我需要的是这个:

  • http://example.com/path=>http://service
  • http://example.com/path/bar=>http://service/bar
  • http://example.com/path/file.css=>http://service/file.css

也就是说,使其/path成为上游服务器中的根(或某个不同的 URL)。

据我所见这里,这是使用 proxy_pass 上的尾随斜杠完成的,但 nginx ingress 似乎没有这个选项。

这是可能的 nginx 入口吗?

答案1

在 Nginx Ingress 上可行吗?

  • 是的,为了实现它,你可以使用rewrite-target

  • 它将创建一个捕获组并将其发送到适当的服务。这是一个 Ingress 示例:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: "rewrite"
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
    - http: example.com
        paths: 
          - path: /foo(/|$)(.*)
            backend:
              serviceName: echo-svc
              servicePort: 80

在这个入口定义中,任何被捕获的字符都(.*)将被分配给占位符$2,然后将其用作注释中的参数rewrite-target

这个入口将执行以下操作:

  • 请求/foo将作为/
  • 请求/foo/bar将作为/酒吧
  • 请求/foo/file.css将作为/文件.css
  • Nginx Ingress 用途路径优先级

在 NGINX 中,正则表达式遵循首次匹配策略。为了实现更准确的路径匹配,ingress-nginx 首先按长度降序排列路径,然后将其作为位置块写入 NGINX 模板。


例子:

$ kubectl apply -f echo-ingress.yaml 
ingress.networking.k8s.io/echo-ingress created

$ kubectl get ingress
NAME           HOSTS          ADDRESS        PORTS   AGE
echo-ingress   mydomain.com   35.188.7.149   80      48s

$ tail -n 1 /etc/hosts
35.188.7.149 mydomain.com

$ curl mydomain.com/foo/bar
{"path": "/bar",
...suppressed output...
  "os": {"hostname": "echo-deploy-764d5df7cf-6m5nz"}
}

$ curl mydomain.com/foo
{"path": "/",
  "os": {"hostname": "echo-deploy-764d5df7cf-6m5nz"}
}

如果您有任何问题,请在评论中告诉我。

答案2

简而言之:是的。请确保不要混淆 nginx-ingress(您在问题中将其用作标签)和 ingress-nginx,它们是不同的。它通过根据文档安装 ingress-nginx 来工作。@Will ROF 提供的答案显示了如何操作,文档可以在这里找到: https://kubernetes.github.io/ingress-nginx/user-guide/ingress-path-matching/

相关内容