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

Envoy中在envoy_on_response阶段能否访问客户端请求头?

在Envoy的envoy_on_response阶段访问请求头并修改响应头
  • 核心结论:可以实现基于请求头条件修改响应头的需求,但不能直接在envoy_on_response阶段读取原始请求头,需要先在envoy_on_request阶段将所需请求头存入Stream Info的动态元数据,再在响应阶段调用。

  • 具体实现步骤:

    1. 请求阶段存储目标请求头
      在envoy_on_request钩子中提取需要的请求头,写入自定义命名空间的动态元数据:
      function envoy_on_request(request_handle)
          -- 提取业务需要的请求头,例如X-User-Role
          local user_role = request_handle:headers():get("X-User-Role")
          if user_role then
              -- 将请求头存入动态元数据,自定义命名空间避免冲突
              request_handle:streamInfo():dynamicMetadata():set("req_meta", "user_role", user_role)
          end
      end
      
    2. 响应阶段读取元数据并修改响应头
      在envoy_on_response钩子中读取之前存储的元数据,根据条件修改响应头:
      function envoy_on_response(response_handle)
          -- 从动态元数据中获取请求阶段存储的字段
          local user_role = response_handle:streamInfo():dynamicMetadata():get("req_meta", "user_role")
          -- 根据请求头条件修改响应头
          if user_role == "admin" then
              response_handle:headers():set("X-Access-Permit", "full")
          else
              response_handle:headers():set("X-Access-Permit", "limited")
          end
      end
      
  • 注意事项:

    • 仅存储业务逻辑必需的请求头字段,避免不必要的性能损耗。
    • 动态元数据的命名空间(如示例中的req_meta)可自定义,需避免与Envoy内置或其他插件的元数据命名冲突。
    • 若需访问客户端IP、请求方法等Envoy内置请求信息,可直接通过streamInfo调用,无需额外存储。

内容的提问来源于stack exchange,提问作者Parzival

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 13:39:51