Envoy Lua Filter发起HTTP请求遇400问题及:authority头修改疑问
Envoy Lua Filter httpCall请求400问题分析
问题场景
在Envoy Lua Filter中使用request_handle:httpCall发起请求时,初始代码如下:
function envoy_on_request(request_handle) -- Make an HTTP call to an upstream host with the following headers, body, and timeout. local headers, body = request_handle:httpCall( "lua_cluster", { [":method"] = "POST", [":path"] = "/", [":authority"] = "lua_cluster" }, "hello world", 5000)
已在envoy.yaml中配置名为lua_cluster的集群,但请求返回400且未到达目标服务器;将:authority值改为集群的实际URL主机名后,请求成功返回200。
原因解析
:authority字段的本质:这个HTTP/2伪头等价于HTTP/1.1的Host头,是上游服务器用来识别请求对应虚拟主机的核心字段,必须匹配服务器端配置的主机标识。- 集群名的作用范围:
lua_cluster是Envoy内部定义的集群别名,仅用于Envoy自身识别要转发到哪一组上游节点,上游服务器完全不知道这个名称。当你把:authority设为集群名时,上游服务器无法匹配到对应的虚拟主机配置,因此返回400错误。 - Envoy转发逻辑:
httpCall的第一个参数(集群名)是告诉Envoy选哪个上游集群,而:authority是要传递给上游服务器的真实主机信息,二者职责完全分离,不能混用。
合规性说明
修正后的操作完全合规。:authority的规范用法就是传入上游服务器实际监听的主机名(即集群配置中目标节点的真实域名、IP或IP+端口),这既符合HTTP/2协议对:authority字段的定义,也符合Envoy Lua Filter的使用要求。之前的错误是混淆了Envoy内部标识和上游服务器需要的请求标识,修正后的写法才是正确的实践。
内容的提问来源于stack exchange,提问作者Chen
相关产品推荐
相关产品推荐

