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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 10:21:37