现状: 我们正在使用 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()
似乎是空的或不存在。
问题:
版本: Docker 镜像
envoyproxy/envoy:v1.16.2
这里也一样:
request_handle:streamInfo():requestedServerName()
总是空的