gpt4 book ai didi

http - Varnish 和 ESI HTTP AUTH

转载 作者:可可西里 更新时间:2023-11-01 16:28:40 26 4
gpt4 key购买 nike

我对这个问题很迷茫,我不知道问题出在哪里,所以,我希望你能帮助我。

我有 symfony 的 HTTP BASIC 身份验证,我试图访问一个受此身份验证保护的 url,在 Drupal 页面中有一个标记。每个请求都发送到 Varnish

我这样在 url 中提供用户名和密码:

<esi:include src="http://admin:adminpass@api.dev:8081/app.php/next"/>

在我的 varnish 配置文件中,我只有 auth.http 的那些行:

if (req.http.Authorization) {
return (pass);
}

我的 Symfony 后端在没有 http 身份验证的情况下运行良好,并且在没有 Varnish 和 esi 标签的情况下,http 身份验证也运行良好。

如果有人知道这个问题,请告诉我,即使它是错误的=)

最佳答案

varnish 中的 ESI 不像浏览器中的 iframe 或链接标记那样工作,因为它不会连接到您提供的任何 url。 ESI 只是在 varnish 中启动一个新请求并完成工作流(vcl_recv 等)。

您希望 Varnish 像 http 客户端一样工作,解析 url,设置授权 header ,将主机 header 设置为 api.dev:8081 并启动新的 http 连接/请求,但它不会。在这种情况下,我的猜测是它启动了一个新的请求,其中 req.url 设置为/app.php/next 从父资源(包含 esi 标签)的请求中继承 header ,或者可能只是完全忽略 esi 标签。

完成你想做的事情的方法是(在vcl_recv中):

if (req.esi_level > 0 && req.url == "/app.php/next") {
set req.http.Authorization = "BASIC [base64 encoded admin:adminpass]"
return (pass);
}

然后 esi 标签应该看起来像 <esi:include src="/app.php/next" />

如果您需要 ESI 请求命中不同的后端服务器,您需要将该服务器添加为不同的命名后端:

backend authorization_needed {
.host = "api.dev";
.port = "8081";
}

在 vcl_recv 中,告诉 varnish 将它用于 esi 请求:

if (req.esi_level > 0 && req.url == "/app.php/next") {
set req.http.Authorization = "BASIC [base64 encoded admin:adminpass]"
set req.backend = authorization_needed;
return (pass);
}

如果后端响应与“api.dev”不同的虚拟主机,您可能还需要在 if block 中设置 req.http.Host。

更新:

由于基本授权来自客户端,并且您在 req.http.Authorization 存在时调用 return (pass),varnish 将不会以 ESI 处理这些页面。您必须在 vcl_fetch() 中显式启用 esi,它在您通过时不会被调用。

因此,要通过 ESI 片段而不是父页面的授权,请更改 vcl_rev:

if (req.http.Authorization && req.esi_level == 0) {
set req.http.X-Esi-Authorization = req.http.Authorization;
unset req.http.Authorization;
}
else if (req.http.X-Esi-Authorization && req.esi_level > 0 ) {
set req.http.Authorization = req.http.X-Esi-Authorization;
return (pass);
}

并添加到vcl_fetch:

if (req.http.X-Esi-Authorization) {
set beresp.do_esi = true;
}

最终效果是父响应是可缓存的并且将处理 esi,esi 片段本身将始终与客户端的授权 header 一起传递到后端。

关于http - Varnish 和 ESI HTTP AUTH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17704712/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com