Varnish 验证缓存的请求

标签 varnish varnish-vcl esi

我有一个私有(private) Intranet 风格的网站,每个人都必须先登录才能看到任何内容。一旦他们登录,每个页面都是相同的 - 所以我希望这些页面缓存在 Varnish 中,但仍然需要快速的用户访问检查。

所以我想这样做,我会在我的 VCL 文件中创建一个规则,将每个传入的请求重写到一个文件。该文件不被缓存并检查用户是否有效,如果是,则打印缓存页面的 esi 包含。

这一切都很好,除了将缓存页面的第二个请求标识为经过身份验证。我正在考虑在请求中添加一个查询字符串,并检查它。或者也许有一种方法可以检查是否已通过 esi:include 发出请求。
也许我以错误的方式处理这个问题?

有什么建议么?

最佳答案

如果您不想在 URL 中使用带有身份验证 token 的经过身份验证的请求,您可以检查 req.esi_level 并确保它对于需要登录的资源大于 0。

if (req.esi_level == 0 && req.url ~ "^/private/.*" ) {
    error (403);
}

需要注意的是,您需要防止从除 Varnish 之外的所有内容访问您的后端——您可能无论如何都在这样做,但值得注意的是。

关于Varnish 验证缓存的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17674219/

相关文章:

ubuntu - Varnish 503 后端获取失败

nginx - 如何强制浏览器在代码部署后重新加载静态 Assets ?

Varnish - 为什么有两个过程

validation - Symfony2 主页 HTTP 缓存验证和独立 ESI

php - 访问 ESI 标记内的 php 变量

python - 如何在 Django、Varnish、Nginx 中处理数千个遗留 URL?

caching - 使用 Symfony2,为什么缓存响应中的 ESI 标签会被忽略?

php - Symfony ESI 获取 FORM 提交的 POST 参数或调用 ESI 作为 POST

php - 在Cpanel服务器上安装Varnish Cache 4

varnish - 如何在varnish-vcl中提取字符串的前n个字符?