GCP上NGINX Ingress Controller自定义请求头丢失问题解决
解决NGINX Ingress Controller无法传递自定义SIGNATURE请求头的问题
我来帮你搞定这个头传递的问题,先从代码和Ingress配置两个核心点入手:
第一步:先修正Spring Boot控制器的代码错误
你的控制器里有个明显的小问题:@RequestHeader("application/json")是错的!application/json是Content-Type头的值,不是头的名称。正确写法应该是:
public ResponseEntity<TransactionDTO> get( @RequestHeader("SIGNATURE") String apiSignature, @RequestHeader("Content-Type") String contentType, @PathVariable Long id)
这个错误虽然不是你当前报错的直接原因,但后续肯定会触发Missing request header 'application/json'异常,建议先修正。
第二步:配置NGINX Ingress确保自定义头被转发
NGINX Ingress默认会传递标准请求头,但自定义头有时候需要显式配置才能到达后端。你只需要给Ingress添加一个注解,强制NGINX把SIGNATURE头转发到后端服务:
修改你的Ingress YAML配置,新增configuration-snippet注解:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: api-ingress annotations: kubernetes.io/ingress.class: nginx ingress.kubernetes.io/rewrite-target: / nginx.ingress.kubernetes.io/ssl-redirect: "false" # 新增这个注解,显式传递SIGNATURE头 nginx.ingress.kubernetes.io/configuration-snippet: | proxy_set_header SIGNATURE $http_signature; spec: rules: - host: api.domain.com.br http: paths: - path: /manager backend: serviceName: api-svc servicePort: 8086
这里$http_signature是NGINX的内置变量,对应客户端发送的SIGNATURE请求头(NGINX会自动把大写头名转成小写+下划线的格式)。
第三步:验证配置生效
应用修改后的Ingress配置:
kubectl apply -f your-ingress-config.yaml
之后可以用两种方式验证:
- 查看NGINX Ingress Pod的日志,确认配置已经加载:
kubectl logs -n <你的Ingress命名空间> <nginx-ingress-pod名称>
- 用
curl直接测试请求:
curl -H "SIGNATURE: test-123" https://api.domain.com.br/manager/1
额外排查点
如果还是不行,可以检查这几个地方:
- 确认Postman发送请求时,
SIGNATURE头的拼写没有错误(HTTP头不区分大小写,但尽量保持一致); - 如果你的K8s集群里有服务网格(比如Istio),检查是否有其他组件拦截了请求头;
- 查看后端Pod的日志,确认请求到达时是否真的没有
SIGNATURE头,排除后端代码的其他问题。
内容的提问来源于stack exchange,提问作者Alexandre Barbosa de Sousa




