Kubernetes Ingress问题:www域名访问404,主域名正常
问题
访问http://www.example.com时出现404错误,但https://example.com能正常访问。Ingress配置如下:
# Ingress apiVersion: networking.k8s.io/v1 # make a new cert kind: Ingress metadata: name: ${APP_NAME} annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/ssl-redirect: 'true' nginx.ingress.kubernetes.io/from-to-www-redirect: 'true' spec: defaultBackend: service: name: ${APP_NAME} port: number: 80 tls: - secretName: ${APP_NAME} hosts: - ${URL} - www.${URL}
执行kubectl describe ingress后,返回结果显示host为example.com,怀疑是配置导致www域名无法正常重定向。
分析与解决
- 问题根源:你的Ingress配置里未显式定义
rules匹配www.example.com和example.com,仅靠defaultBackend和tls配置不足以让NGINX Ingress Controller正确处理www域名的HTTP请求重定向。虽然tls包含了www.${URL},但无对应路由规则时,HTTP(80端口)访问www.example.com会因找不到匹配规则返回404;而HTTPS的www.example.com能正常访问,是因为tls配置覆盖了该域名,请求会被defaultBackend承接。 - 修复步骤:
- 在Ingress的
spec中添加rules字段,明确匹配两个域名的请求:spec: rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: ${APP_NAME} port: number: 80 - host: www.example.com http: paths: - path: / pathType: Prefix backend: service: name: ${APP_NAME} port: number: 80 # 保留原有defaultBackend和tls配置 defaultBackend: service: name: ${APP_NAME} port: number: 80 tls: - secretName: ${APP_NAME} hosts: - ${URL} - www.${URL} - 应用更新后的配置:
kubectl apply -f your-ingress-file.yaml - 验证配置生效:
此时应能看到kubectl describe ingress ${APP_NAME}example.com和www.example.com两个host均被列出。
- 在Ingress的
- 注解生效条件:
nginx.ingress.kubernetes.io/from-to-www-redirect: 'true'需要Ingress Controller识别到www域名的规则才会触发重定向逻辑,无对应rules时,控制器无法执行该重定向操作。
内容的提问来源于stack exchange,提问作者user9468014
相关产品推荐
相关产品推荐

