如何在Nginx Ingress中基于自定义Header实现HTTPS条件重定向?
实现Nginx Ingress条件式HTTPS重定向配置
针对你的EKS架构(用户 -> CloudFront -> ALB -> EKS Nginx Ingress),要实现CloudFront通过HTTP连接ALB,同时对非CloudFront的HTTP请求强制重定向到HTTPS,可按以下两步配置:
一、给CloudFront请求添加自定义Header
在CloudFront分发中配置自定义源请求头,标记来自CloudFront的请求:
- 登录AWS控制台,进入目标CloudFront分发
- 切换到Behaviors标签,编辑目标行为
- 找到Origin Request Headers区域,点击Add Custom Header
- 设置Header名称(例如
X-CloudFront-Request)和固定值(例如true),保存更改
二、配置Nginx Ingress实现条件重定向
需要关闭全局的强制HTTPS重定向,添加基于自定义Header的条件判断规则,以下两种方式任选:
方式1:单Ingress资源配置(推荐)
修改你的Ingress YAML,通过annotations插入自定义Nginx规则:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: your-ingress-resource annotations: # 关闭默认的全局HTTPS重定向 nginx.ingress.kubernetes.io/force-ssl-redirect: "false" nginx.ingress.kubernetes.io/ssl-redirect: "false" # 插入条件重定向规则 nginx.ingress.kubernetes.io/configuration-snippet: | if ($http_x_cloudfront_request != "true") { return 301 https://$host$request_uri; } spec: rules: - host: your-domain.example.com http: paths: - path: / pathType: Prefix backend: service: name: your-backend-service port: number: 80
说明:当请求不包含指定的CloudFront自定义Header时,会触发301重定向到HTTPS;来自CloudFront的请求因带Header,直接返回HTTP响应。
方式2:全局ConfigMap配置(适用于所有Ingress)
如果所有Ingress都需要此规则,可修改Nginx Ingress Controller的ConfigMap:
apiVersion: v1 kind: ConfigMap metadata: name: nginx-ingress-controller namespace: kube-system # 根据你的Ingress Controller命名空间调整 data: force-ssl-redirect: "false" ssl-redirect: "false" server-snippet: | if ($http_x_cloudfront_request != "true") { return 301 https://$host$request_uri; }
修改后等待Ingress Controller自动重载配置即可。
验证配置
- 直接访问ALB的HTTP端点:应被重定向到HTTPS
- 通过CloudFront访问:请求会携带自定义Header,Nginx直接返回HTTP响应(CloudFront会将其转换为HTTPS返回给用户)
内容的提问来源于stack exchange,提问作者infinite_loop
相关产品推荐
相关产品推荐

