K8s中Ingress配置HTTPS后拦截HTTP后端响应如何解决?
故障根因
你遇到的报错并非Ingress拦截返回内容,而是浏览器的混合内容安全策略拦截:
从HTTPS站点加载的页面,内部JS主动发起HTTP协议的异步请求会被浏览器默认阻止,请求还未离开客户端就被拦截,和K8s集群内部webserver到查询服务的HTTP通信链路无关。
修复方案
方案1:前端请求改为同源相对路径(最推荐,适配性最高)
- 修改Angular代码里硬编码的后端请求地址,把
http://backend:port/end_point这类绝对HTTP地址改为/api/end_point这类相对路径,请求会自动沿用当前页面的HTTPS协议与域名,即请求地址变为https://myserver.com/api/end_point - 在Ingress中新增路径转发规则,将
/api/前缀的请求直接转发到后端的查询响应服务,无需为后端服务单独配置HTTPS证书
方案2:配置Ingress传递HTTPS标识(适配后端返回绝对路径的场景)
如果你的后端服务会返回带协议的绝对路径响应,需要配置链路透传HTTPS标识:
- 给对应Ingress资源添加如下annotations(以NGINX Ingress为例):
annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" nginx.ingress.kubernetes.io/use-forwarded-headers: "true" nginx.ingress.kubernetes.io/x-forwarded-proto: "https"
- 同时配置Angular对应的webserver(如Nginx、Node.js)信任X-Forwarded系列头,以Nginx为例,在配置中新增:
fastcgi_param HTTPS on; fastcgi_param HTTP_X_FORWARDED_PROTO $http_x_forwarded_proto;
方案3:强制升级不安全请求(临时兜底方案)
如果暂时无法修改前端代码,可以在前端webserver的响应头中添加内容安全策略配置,让浏览器自动把HTTP请求升级为HTTPS发起:
add_header Content-Security-Policy "upgrade-insecure-requests;";
此方案为兜底方案,需要确认升级后的HTTPS请求路径可以正常访问。
内容的提问来源于stack exchange,提问作者Jin Ma
相关产品推荐
相关产品推荐

