如何重写 url 到后端,同时在 nginx 入口中保留浏览器 url?

Nat*_*tan 15 nginx kubernetes nginx-ingress

我正在尝试重写服务的路径,同时在 kubernetes 上使用 nginx 入口保留浏览器 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 入口吗?

小智 14

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
Run Code Online (Sandbox Code Playgroud)

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

该入口将执行以下操作:

  • 对/foo 的请求将作为/传递到 echo1-svc
  • /foo/bar 的请求将作为/bar传递到 echo1-svc
  • 对/foo/file.css的请求将作为/file.css传递到 echo-svc
  • 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"}
}
Run Code Online (Sandbox Code Playgroud)

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