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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:40:41