You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GKE负载均衡器未重写URL致非根应用404,如何配置URL重写?

解决GKE GCE Ingress的URL路径重写问题

核心问题分析

你的场景是GKE集群中,通过GCE内部Ingress将/doc路径转发到静态文档应用,但应用收到的请求仍带有/doc前缀,导致Nginx去查找/usr/share/nginx/html/doc/index.html,而实际静态文件都放在/usr/share/nginx/html/根目录,因此返回404。直接修改GCP HTTP负载均衡器的routeAction.urlRewrite会被GKE Ingress控制器(GLBC)覆盖,必须通过Ingress配置实现重写。

可行方案

方案1:使用GKE专属FrontendConfig实现重写

GCE Ingress控制器不兼容通用的rewrite-target注解,需使用GKE提供的FrontendConfig资源配置URL重写:

  1. 给Ingress添加关联FrontendConfig的注解:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    # 新增此注解关联重写配置
    networking.gke.io/v1beta1.FrontendConfig: "doc-rewrite-config"
    # 保留原其他注解...
    kubernetes.io/ingress.class: gce-internal
    kubernetes.io/ingress.regional-static-ip-name: myapp-internal-load-balancer
  # 保留原其他metadata内容...
spec:
  # 保留原spec内容...
  1. 创建对应的FrontendConfig资源,定义路径重写规则:
apiVersion: networking.gke.io/v1beta1
kind: FrontendConfig
metadata:
  name: doc-rewrite-config
spec:
  urlRewrite:
    pathPrefixRewrite: "/"
    pathRedirect: "/"

部署后,GLBC会自动将该规则同步到GCP HTTP负载均衡器的URL映射中,实现/doc路径请求转发到应用时重写为/。

方案2:应用侧Nginx配置适配(备选)

如果无法使用FrontendConfig,可通过修改Nginx配置实现路径重写:

  1. 为文档应用创建Nginx配置文件default.conf:
server {
    listen 80;
    server_name localhost;

    location /doc {
        rewrite ^/doc(/.*)$ $1 break;
        root /usr/share/nginx/html;
        index index.html;
    }

    location / {
        root /usr/share/nginx/html;
        index index.html;
    }
}
  1. 修改文档应用的Dockerfile,注入该配置:
FROM blabla.artifactory.mycompany.net/nginx:latest
COPY ./doc/html/ /usr/share/nginx/html/
COPY ./default.conf /etc/nginx/conf.d/default.conf

重新构建镜像并部署后,Nginx会自动将/doc开头的请求路径重写为根路径,匹配静态文件的实际存储位置。

关键说明

你之前使用的ingress.kubernetes.io/rewrite-target是NGINX Ingress Controller的专属注解,而你使用的是gce-internal类型Ingress,由GLBC管理,不兼容该注解,这是旧配置无效的核心原因。


内容的提问来源于stack exchange,提问作者Vulpo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 22:37:04