如何使用 Envoy 前端代理仅重定向一个域而不是 401 上的所有域

问题描述 投票:0回答:1

现状: 我们正在使用 envoyproxy 过滤状态为 401 的超时(因此未经授权)流量,以重定向到所有

.*\\.domain\\.de(:3000)?

上的 login.domain.tld

因此,在

envoy.yaml

inline_code: |
  function envoy_on_response(response_handle)
    if response_handle:headers():get(":status") == "401" then
      response_handle:headers():replace(":status", "301")
      response_handle:headers():replace("location", "https://login.domain.tld")
    end
  end

示例代码:https://github.com/envoyproxy/envoy/blob/main/examples/lua/envoy.yaml#L30-L39, YAML 路径:

static_resources.listeners:.address.filter_chains.filters.'envoy.http_connection_manager'.config.http_filters.'envoy.lua'config.inline_code

立即发出,我们想将重定向从所有子域仅更改为一个。我们假设,这只是在上面的代码中添加一个条件即可完成。

为什么? 我们在范围内有许多子域,例如api-{000..999}.domain.tld,所有这些都是 REST api,如果缺少 AUTH,则不会重定向。

尝试过的解决方案: 我们假设,阅读文档,https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/lua_filter#requestedservername可以解决这个问题,因此添加了第二个条件:

inline_code: |
  function envoy_on_request(request_handle)
    local SNI = request_handle:streamInfo():requestedServerName()
  end
  function envoy_on_response(response_handle) 
    local SNI_str = tostring(SNI)
    local MATCH_str = "app.domain.tld"
    if response_handle:headers():get(":status") == "401" and string.find(SNI_str,MATCH_str) then
      response_handle:headers():replace(":status", "301")
      response_handle:headers():replace("location", "https://login.domain.tld")
    end
  end

遗憾的是上面的代码不起作用,该对象

request_handle:streamInfo():requestedServerName()
似乎是空的或不存在。

问题:

  • 我们可以使用什么对象从请求中获取 SNI 并将其转换为字符串类型?
  • 如果这不是一个选项,我们如何区分重定向的域?更多过滤?

版本: Docker 镜像

envoyproxy/envoy:v1.16.2

lua envoyproxy
1个回答
0
投票

这里也一样:

request_handle:streamInfo():requestedServerName()
总是空的

© www.soinside.com 2019 - 2024. All rights reserved.