Nginx Ingress路径匹配异常 访问Keycloak控制台报404
问题根因
出现管理员控制台404的核心原因是反向代理路径适配逻辑不匹配:
- 当前Nginx Ingress配置了
/auth-svc前缀路径,搭配rewrite-target: /$2规则会把请求路径里的/auth-svc前缀剥离后再转发给后端Keycloak服务。但Keycloak默认生成的内部跳转链接(包括管理员控制台入口地址)是基于自身服务根路径生成的,不会自动感知外层Ingress加的/auth-svc前缀,点击跳转时请求会直接发往/auth/admin/xxx路径,匹配不到Ingress上配置的/auth-svc开头的路由规则,直接返回404。 - 测试把Ingress路径改成根路径
/、或者直接用LoadBalancer暴露服务直连时功能全部正常,已经可以排除Keycloak服务本身故障,问题完全出在反向代理的路径适配环节。
解决方案
根据部署需求二选一即可:
方案1:根路径直接暴露(最简单,和直连LoadBalancer效果一致)
直接去掉路径重写规则,把Ingress匹配路径改成根路径,配置参考:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: awesome-ingress spec: ingressClassName: nginx rules: - http: paths: - path: / pathType: Prefix backend: service: name: auth-service-svc port: number: 80
配置生效后直接访问http://<ingress-ip>/auth/即可进入首页,所有内部跳转都不会出现路径丢失问题。
方案2:保留/auth-svc访问前缀(需同步修改Keycloak配置)
如果业务要求必须保留/auth-svc的访问前缀,需要同时调整两处配置:
- 修改Keycloak启动参数,让它生成的所有跳转链接自动带上
/auth-svc前缀:
在auth-service-svc对应的工作负载(Deployment/StatefulSet)中添加环境变量:
如果使用的是Quarkus架构之前的旧版WildFly Keycloak,把上面的env: - name: KEYCLOAK_HTTP_RELATIVE_PATH value: /auth-svc/auth - name: PROXY_ADDRESS_FORWARDING value: "true"KEYCLOAK_HTTP_RELATIVE_PATH替换为KEYCLOAK_FRONTEND_URL,值设置为实际访问地址http://<访问IP或域名>/auth-svc/auth即可 - 调整Ingress配置,添加必要的代理转发头,保证Keycloak能正确识别外层代理信息,配置参考:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: awesome-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 nginx.ingress.kubernetes.io/configuration-snippet: | proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; spec: ingressClassName: nginx rules: - http: paths: - path: /auth-svc(/|$)(.*) pathType: Prefix backend: service: name: auth-service-svc port: number: 80
配置完成后重启Keycloak Pod,再访问http://<ingress-ip>/auth-svc/auth/,点击管理员控制台即可正常跳转到登录页。
内容的提问来源于stack exchange,提问作者Yashvardhan Nathawat
相关产品推荐
相关产品推荐

