You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

GCP上NGINX Ingress Controller自定义请求头丢失问题解决

解决NGINX Ingress Controller无法传递自定义SIGNATURE请求头的问题

我来帮你搞定这个头传递的问题,先从代码和Ingress配置两个核心点入手:

第一步:先修正Spring Boot控制器的代码错误

你的控制器里有个明显的小问题:@RequestHeader("application/json")是错的!application/jsonContent-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

之后可以用两种方式验证:

  1. 查看NGINX Ingress Pod的日志,确认配置已经加载:
kubectl logs -n <你的Ingress命名空间> <nginx-ingress-pod名称>
  1. 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

火山引擎 最新活动