Varnish 和 ESI HTTP AUTH

2024-01-04

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

我有 symfony 的 HTTP BASIC 身份验证,并且我正在尝试访问受此身份验证保护的 url,并在 Drupal 页面中使用标签。每个请求都会发送到 Varnish

我在网址中提供用户名和密码,如下所示:

<esi:include src="http://admin:[email protected] /cdn-cgi/l/email-protection: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,设置授权标头,将主机标头设置为 api.dev:8081 并启动一个新的http连接/请求,但它不会。在这种情况下,我的猜测是它会启动一个新的请求,并将 req.url 设置为 /app.php/next 继承父资源请求的标头(包含 esi 标签),或者可能完全忽略 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 块中设置 req.http.Host。

Update:

由于基本授权来自客户端,并且当存在 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 片段本身将始终与客户端的授权标头一起传递到后端。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Varnish 和 ESI HTTP AUTH 的相关文章

随机推荐

  • 如何修复“按钮”交互角色必须可聚焦

    我有用户可以选择的下拉选项列表 下拉列表中的选项是用标签 a gt handleSelect filter role button gt filter name a 问题是我必须添加tabIndex 0 or 1 修复 Eslint 的错误
  • 跨 HttpHandler 保留会话变量

    我有一个带有 5 个 ashx HTTPHandler 的 ASP NET 应用程序 它们实现 IRequiresSessionState 或 IReadOnlySessionState 调用第一个处理程序后 我创建一个变量并将其存储在会话
  • 为什么“None”与“np.newaxis”具有相同的效果? [复制]

    这个问题在这里已经有答案了 Why None具有保存效果np newaxis 例如 使用 np arange 10 None or np arange 10 np newaxis 两者都创建 array 0 1 2 3 4 5 6 7 8
  • 从命令行执行时如何阻止 PHP 返回标头?

    这可能是一个可笑的问题 但它已经困扰我一段时间了 我有一个邮件转发器通过管道传输到 PHP 脚本 它接收完美 但是我立即收到以下错误邮件 A message that you sent could not be delivered to o
  • 使用2个不同的数据源:Spring批处理

    我有2个不同的数据源 一个用于读取 另一个用于写入结果 如下所示 ItemReader 应从 dataSource 1 获取数据 ItemWriter 应将数据写入 dataSource 2 知道读者和作者在同一个任务中 根据文档 我们可以
  • [email protected] 需要有一个react@^15,但没有安装。您必须自己安装对等依赖项

    我已经使用安装了所有必需的库npm install我也做了npm install save email protected cdn cgi l email protection但我仍然收到此错误 我的包 json author licens
  • 用C#检测IE11

    在加载网页之前 我会检测浏览器和版本以确定兼容性 因此 如果浏览器低于 IE7 我会显示一条不兼容的消息 在 IE11 中测试网页 我的网页显示不兼容的消息 我目前正在从以下位置获取浏览器名称 var browser Request Bro
  • Mac OS 的 Perf stat 等效项?

    Mac OS 上有等效的性能统计吗 我想对 CLI 命令做同样的事情 但谷歌搜索没有产生任何结果 Mac OS X 中有 Instruments 工具来分析应用程序 包括硬件 PMU 默认是对 CPU 使用情况进行采样分析器 一些文档 ht
  • 定义开放图谱帖子的显示方式

    我已成功将自定义开放图谱对象 操作发布到 Facebook 我们的生产和登台环境都有自己的 FB 应用程序 其配置相同 除了在我们的生产应用程序中 对象和操作得到批准 就像我们的应用程序详细信息页面一样 但由于某种原因 舞台会发布一张更大的
  • iOS 多次保存带进度条的解析对象

    我发现这个非常有趣的方法 解析 是否可以跟踪 PFObject 上传的进度 https stackoverflow com questions 24010913 parse is it possible to follow progress
  • 如何向非程序员解释接口和抽象类之间的区别? [复制]

    这个问题在这里已经有答案了 可能的重复 何时使用接口而不是抽象类 反之亦然 https stackoverflow com questions 479142 when to use an interface instead of an ab
  • 为什么浏览器接受通过非安全 (HTTP) 连接发送的安全 cookie?

    当 IE 11 Firefox 26 Chrome 32 等浏览器通过指定了 安全 属性的不安全 HTTP 连接接收 Cookie 时 它 们会存储 Cookie 并在向同一服务器发出请求后将其发回安全 HTTPS 连接 虽然这可能符合某些
  • Control.invoke 和父控件

    假设我有一个名为 MainForm 的表单及其上的控件 somelabel 为了从另一个线程访问这些控件 我必须使用 Invoke 方法 例如 somelabel Invoke 不过我也可以访问label通过这样的形式 MainForm I
  • mono/linux 套接字被拒绝?

    我在用炼金术网络套接字 http alchemywebsockets net 并弄清楚了足够的东西可以在 Windows 上运行 我在 Linux ubuntu 上用 mono 构建了 alchemy 并运行了我的服务器 它收到套接字错误
  • Rails DB 中使用 CamelCase 代替 Snake_case

    我的数据库表和字段名称采用驼峰命名法 是否可以将这些名称即时转换为snake case 为了让模型方法看起来更漂亮 该应用程序是 JRubyOnRails 3 0 MSSQL DB ActiveRecord JDBC 适配器 arkadiy
  • 使用 scrapy 递归抓取网站

    我正在尝试使用 scrapy 废弃一个网站 这是我到目前为止编写的代码http thuongnh com building a web crawler with scrapy http thuongnh com building a web
  • 从可迭代对象创建字典

    从可迭代创建字典并为其分配一些默认值的最简单方法是什么 我试过 gt gt gt x dict zip range 0 10 range 0 但这不起作用 因为 range 0 不是可迭代的 因为我认为它不会是可迭代的 但我还是尝试了 那么
  • 使用 codeigniter 获取 $config['encrypt_name'] 之后的文件名

    无论如何 我是否可以在加密后获取文件的文件名 以便我可以将文件名保存到我的数据库中 config encrypt name TRUE 这种加密一般是改变镜像文件的文件名 我想知道如何获取它或将其保存到变量中 提前致谢 this gt 上传
  • 如何在没有index.html的情况下使用Jekyll-paginate?

    我正在尝试在 Github 页面上构建我的博客 出于显而易见的原因我必须使用 Jekyll paginate 问题是 除了欢迎页面之外 我不将 index html 页面用于任何其他用途 我在名为articles的文件夹中有一个名为inde
  • Varnish 和 ESI HTTP AUTH

    我对这个问题很迷茫 我不知道问题出在哪里 所以 我希望你能帮助我 我有 symfony 的 HTTP BASIC 身份验证 并且我正在尝试访问受此身份验证保护的 url 并在 Drupal 页面中使用标签 每个请求都会发送到 Varnish