Kubernetes Nginx Controller:避免静态资源被302重定向至HTTPS
问题描述
我拥有一个本地K3s集群,通过Helm安装了Nginx Ingress Controller,集群内有两个服务:Spring Boot应用myapp和OAuth2认证服务auth-server。我希望应用仅通过HTTP运行,因此配置了如下Ingress资源:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: myapp-ingress annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/configuration-snippet: |- if ($uri = /){ return 302 http://$http_host/myapp/; } nginx.ingress.kubernetes.io/force-ssl-redirect: "false" nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/backend-protocol: "HTTP" spec: ingressClassName: nginx rules: - host: myapp.cloud http: paths: - path: /myapp pathType: Prefix backend: service: name: myapp port: number: 80 - path: / pathType: Prefix backend: service: name: auth-server port: number: 8080
同时我在Nginx Controller的ConfigMap中添加了以下参数:
hsts: "false" ssl-redirect: "false" hsts-max-age: "0"
我已清除浏览器(Safari和Firefox)的HSTS缓存,且两个后端服务均已禁用SSL(server.ssl.enabled=false)。
访问http://myapp.cloud时,能正确重定向至认证服务的登录页http://myapp.cloud/login,但页面无法正常加载,因为静态资源(js、css)的请求被302重定向至HTTPS版本,而Nginx默认的虚假证书无效,导致资源无法加载。直接访问静态资源(如http://myapp.cloud/assets/style.css)也会被302重定向至HTTPS版本,同样因证书问题无法加载。但通过端口转发直接访问K8s服务时,静态资源可正常加载。
请问是否可以仅通过HTTP实现正常运行?还是必须使用证书管理器等工具切换至HTTPS?我的配置中缺少了什么?
解决方案
完全可以仅通过HTTP运行,不需要切换到HTTPS,问题出在Nginx Ingress的配置遗漏或冲突上,以下是具体修复步骤:
1. 清理Ingress注解冲突
你的Ingress同时使用了旧版的kubernetes.io/ingress.class注解和新版的spec.ingressClassName字段,可能导致配置解析异常。保留spec.ingressClassName: nginx,删除旧版注解。修改后的Ingress metadata部分:
metadata: name: myapp-ingress annotations: nginx.ingress.kubernetes.io/configuration-snippet: |- if ($uri = /){ return 302 http://$http_host/myapp/; } nginx.ingress.kubernetes.io/force-ssl-redirect: "false" nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
2. 补全Nginx Controller ConfigMap的SSL禁用参数
除现有参数外,添加全局的force-ssl-redirect: "false",确保所有场景下都不会触发HTTPS重定向:
hsts: "false" ssl-redirect: "false" force-ssl-redirect: "false" hsts-max-age: "0"
3. 强制清除HSTS响应头(可选但保险)
在Ingress注解中添加server-snippet,确保返回的响应中彻底清除HSTS头,避免浏览器自动触发HTTPS跳转:
nginx.ingress.kubernetes.io/server-snippet: |- add_header Strict-Transport-Security "" always;
4. 验证Nginx生成的配置
执行以下命令查看Nginx Ingress Pod中的实际配置,确认没有生成return 301 https://$host$request_uri;之类的重定向规则:
kubectl exec -it $(kubectl get pods -n kube-system -l app=nginx-ingress -o name | head -n1) -- cat /etc/nginx/nginx.conf
排查逻辑
因为你直接通过端口转发访问后端服务时静态资源正常,说明问题出在Ingress层面而非后端服务。上述配置修改后,Nginx会彻底禁用所有HTTPS重定向逻辑,确保所有请求都通过HTTP处理。
内容的提问来源于stack exchange,提问作者p_efros

