使用清漆删除基于查询参数的 header

Remove a header based on query param with varnish

我想从 URL 的 中删除 cache-control header具体 查询参数 。例如当存在查询参数 ajax=1 时。

例如

www.domain.com?p=3&scroll=1&ajax=1&scroll=1

这些 被 chrome 浏览器 缓存的时间比我希望的要长,我想在这种特定情况下停止它。我已经尝试过 .htaccess,它适用于静态文件,但对上面提到的 URL 不起作用。

RewriteEngine on
RewriteCond %{QUERY_STRING} (^|&)ajax=1(&|$)
Header unset "Cache-Control"

我可以在下一个网站版本中使用缓存破坏器,但在生产中很困难,担心它会在用户浏览器中不必要地缓存大量文件,所以宁愿实现服务器端。

我的服务器有 Cloudflare 然后 NGINX 终止 SSL 到 Varnish 然后 Apache 上面有一个 Magento 2 实例 运行。所以我想我可以通过 NGINXVarnish 配置,甚至是 Cloudflare 来实现这一点。然而,我似乎无法在 Cloudflare 中找到使用页面规则实现此目的的方法,或者找不到 Varnish 或 Nginx 的示例。

我假设当 ajax=1 是您的 URL 参数的一部分时您不想缓存?

您可以使用以下 VCL 片段在 Varnish 中执行此操作:

sub vcl_backend_response {
    if(bereq.url ~ "\?([^&]*&)*ajax=1(&[^&]*)*$") {
        set beresp.http.cache-control = "private, no-cache, no-store";
        set beresp.uncacheable = true;
    } 
}

此代码段将确保 Varnish 不会缓存 URL 包含 ajax=1 URL 参数的响应。它还将确保位于前面的任何缓存代理不会缓存,因为 Cache-Control: private, no-cache, no-store.

这是您要找的吗?