我想知道避免使用 Varnish 缓存网站的“某些页面”并缓存所有其他页面的正确方法是什么。
这是我尝试使用 vcl conf 做的事情:
sub vcl_fetch {
#set beresp.ttl = 1d;
if (!(req.url ~ "/page1withauth") ||
!(req.url ~ "/page2withauth")) {
unset beresp.http.set-cookie;
}
if (!beresp.cacheable) {
return (pass);
}
if (beresp.http.Set-Cookie) {
return (pass);
}
return (deliver);
}
谢谢
答案1
通常,这将在 vcl_recv 中完成:
sub vcl_recv {
if ( req.url !~ "^/page1withauth" && req.url !~ "^/page2withauth" )
{
unset req.http.Cookie;
remove req.http.Cookie;
}
}
然后,您唯一应该从服务器返回 set-cookie 参数的时间是当您尝试唯一地标识连接时。如果是因为它们只是 POST 或类似操作,那么这已经会避开缓存。如果是因为你只是想唯一地标识它们,那么问题是你的应用程序代码故意破坏了 Varnish;如果可以,请修复你的应用程序,否则你可以覆盖 vcl_fetch,类似于你在这里所做的。