<!-- # TKE Nginx Ingress Controller 路径跳转 --> <!-- tke-nginx-ingress-controller-path-rewrite --> 通过腾讯云容器服务 TKE 创建的 *Nginx Ingress Controller* 类型的 *Ingress* , *path* 指定为默认的 `/` 时可以正常访问站点,指定了二级路径时则无法访问。 此时清单文件大概如下: ```yaml apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx-ingress-test kubernetes.io/ingress.rule-mix: "true" nginx.ingress.kubernetes.io/use-regex: "true" spec: rules: - http: paths: - backend: serviceName: svc-test servicePort: 80 path: /test/ pathType: ImplementationSpecific ``` > 未指定 *host* 时,相当于是 Nginx Ingress 的 IP 地址。 官方文档里没有看到提供非默认路径(`/`)的示例。 找了下 *nginx ingress controller* 的资料,发现是由于缺少 *rewrite-target* 配置导致的。 1. 添加 `nginx.ingress.kubernetes.io/rewrite-target: /$1` 声明; 2. *path* 中添加对应的通配符 `/test/(.*)` 。 修改后清单文件如下: ```yaml apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx-ingress-test kubernetes.io/ingress.rule-mix: "true" nginx.ingress.kubernetes.io/rewrite-target: /$1 nginx.ingress.kubernetes.io/use-regex: "true" spec: rules: - http: paths: - backend: serviceName: svc-test servicePort: 80 path: /test/(.*) pathType: ImplementationSpecific ``` 附1. 如果 *path* 中未指定通配符 `/test/` 会导致如下错误: > Failed to load module script: Expected a JavaScript module script but the server responded with a MIME type of "text/html". Strict MIME type checking is enforced for module scripts per HTML spec. 附2. 还可以使用 `/test(/|$)(.*)` 路径匹配以支持 */test* 路径的跳转。 不过如果前端项目中 *css/js* 资源使用的 `./` 这样的相对路径,会导致这些资源文件路由到域名的根路径下,此时不可以采用这种配置方式。 ```yaml apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - http: paths: - backend: serviceName: svc-test servicePort: 80 path: /test(/|$)(.*) pathType: ImplementationSpecific ``` Loading... 版权声明:本文为博主「佳佳」的原创文章,遵循 CC 4.0 BY-NC-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://www.liujiajia.me/2022/7/16/tke-nginx-ingress-controller-path-rewrite 提交