Envoy中在envoy_on_response阶段能否访问客户端请求头?
在Envoy的envoy_on_response阶段访问请求头并修改响应头
核心结论:可以实现基于请求头条件修改响应头的需求,但不能直接在
envoy_on_response阶段读取原始请求头,需要先在envoy_on_request阶段将所需请求头存入Stream Info的动态元数据,再在响应阶段调用。具体实现步骤:
- 请求阶段存储目标请求头
在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 - 响应阶段读取元数据并修改响应头
在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
相关产品推荐
相关产品推荐

