Nginx Ingress 支持 URL 重写功能。本文为您介绍如何配置 Nginx Ingress 的 URL 重写功能。
在某些应用场景中,后端服务提供的 URL 与 Nginx Ingress 规则中配置的路径不同。默认情况下,Nginx Ingress 将访问路径直接转发到后端服务中的相同路径,如果不配置 URL 重写规则,由于访问路径和服务路径不同,访问将返回404
。此时,需要使用 URL 重写规则,改写服务访问的 URL,使其能够访问到后端服务的真实路径。
Nginx Ingress 支持通过 Annotation 配置 URL 重写规则,示例和说明如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-ingress # 路由规则的名称 annotations: nginx.ingress.kubernetes.io/rewrite-target: "/$2" spec: ingressClassName: nginx # 指定 Ingress Controller rules: - host: example.com # 转发规则域名 http: paths: - backend: service: name: service-demo # 请求被转发到的目标服务名称 port: number: 80 # 请求被转发到的目标服务开放端口号 path: /demo(/|$)(.*) # 访问路径 pathType: ImplementationSpecific
Annotation 说明如下表所示。
Key | 类型 | 是否必须 | 描述 | 默认值 |
---|---|---|---|---|
nginx.ingress.kubernetes.io/rewrite-target | String | 是 | URL 重写的目标 URI,并使用正则表达式定义捕获组。 | 无 |
在nginx.ingress.kubernetes.io/rewrite-target
注解中,您可以使用正则表达式定义捕获组,例如本例中,$2
表示将访问路径中,第二个括号(.*)
中匹配到的所有字符填写到nginx.ingress.kubernetes.io/rewrite-target
注解中。例如:
example.com/demo
会重写为example.com/
example.com/demo/
会重写为example.com/
example.com/demo/test
会重写为example.com/test
kubectl get ingress
预期返回结果如下,表示 Ingress 创建成功。其中180.xxx.xxx.xxx
为 Nginx Ingress 对应 CLB 的公网或私网 IP 地址。
NAME CLASS HOSTS ADDRESS PORTS AGE nginx-ingress nginx example.com 180.xxx.xxx.xxx 80 74s
由于后端服务默认的服务路径为/
,而 Ingress 中配置的路径为/demo
。当未配置 URL 重写规则时,由于路径不一致,直接通过 Ingress 访问服务时,返回404
。
curl -H "Host: example.com" http://180.xxx.xxx.xxx/demo
预期返回结果如下:
<html> <head><title>404 Not Found</title></head> <body> <center><h1>404 Not Found</h1></center> <hr><center>nginx</center> </body> </html>
当配置了 URL 重写规则后,使用以下命令访问服务。
curl -H "Host: example.com" https://180.xxx.xxx.xxx/demo
预期输出如下,能够正确地访问到后端服务。
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>