Istio EnvoyFilter Lua HTTP Filter:如何从request_handle获取请求URI?
Envoy Lua过滤器:获取请求URI/查询参数及可信请求头说明
一、从request_handle获取请求URI路径与查询参数
在envoy_on_request函数中,你可以通过request_handle的headers接口获取:path头(它包含完整的请求路径及查询参数),再用Lua字符串处理逻辑拆分出路径和参数:
function envoy_on_request(request_handle) -- 获取完整请求路径(包含查询参数) local full_path = request_handle:headers():get(":path") if not full_path then return end -- 拆分路径部分与查询参数部分 local path, query_str = full_path:match("([^?]+)%??(.*)") -- 打印路径和原始查询参数字符串 request_handle:logInfo("请求路径: " .. path) request_handle:logInfo("原始查询参数: " .. query_str) -- 可选:将查询参数解析为键值对 local query_params = {} for key, val in query_str:gmatch("([^&]+)=([^&]+)") do -- 若需要可添加URL解码逻辑,比如使用ngx.decode_uri_component query_params[key] = val end -- 示例:获取特定参数值 if query_params["user_id"] then request_handle:logInfo("user_id参数值: " .. query_params["user_id"]) end end
二、":path"与"x-original-url"的可信度对比
:path是可信核心头:它是Envoy的标准内置请求头,直接对应Envoy当前处理的请求URI(可能经过前置过滤器修改),是Envoy路由、转发逻辑的依赖字段,不存在客户端伪造的可能(除非你在前置逻辑中主动修改它),可信度极高。x-original-url是自定义头,可信度依赖场景:这个头一般是前置代理/网关添加的,用来保存客户端原始请求的URL,但它属于自定义头,客户端可以直接伪造。只有当你能确保这个头是由可信的上游服务强制设置,并且在入口处拦截了客户端自行设置的该头时,它才可信。
总结:日常处理Envoy当前请求的路径时,优先用:path;如果需要原始未被修改的请求URL,且能保证x-original-url的安全性,再考虑使用它。
内容的提问来源于stack exchange,提问作者Jerald Baker
相关产品推荐
相关产品推荐

