Varnish:忽略一些用于哈希计算的缓存 cookie
Varnish: ignore some cache cookies for hash computation
情况::
- 即使请求中存在 cookie,Varnish 也需要缓存。
- 请求可能包含 N 个任意 cookie,其中某些已知 cookie 不得构成缓存键的一部分。任意 cookie 不包含任何用户敏感数据,例如。他们是像is_authenticated=1.
这样的美容小帮手
- 在缓存未命中的情况下,实际后端必须接收未受干扰的原始 cookie 集。
- 我不想在 VCL 中检查 URL 模式,因为这假设对后端有太多了解。
这出乎意料地难以解决。到目前为止,我发现的所有解决方案都假定 (2) 有一个白名单,而我需要一个黑名单。大多数解决方案都会删除本应传送到后端的 cookie。
那么(未测试):
# We use builtin.vcl logic and 'return' from our vcl_recv in order
# to prevent default Varnish behaviour of not caching with cookies present
sub vcl_recv {
# your vcl_recv starts here
# ...
# your vcl_recv ends here
if (req.method == "PRI") {
/* We do not support SPDY or HTTP/2.0 */
return (synth(405));
}
if (req.method != "GET" &&
req.method != "HEAD" &&
req.method != "PUT" &&
req.method != "POST" &&
req.method != "TRACE" &&
req.method != "OPTIONS" &&
req.method != "DELETE") {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe);
}
if (req.method != "GET" && req.method != "HEAD") {
/* We only deal with GET and HEAD by default */
return (pass);
}
if (req.http.Authorization) {
/* Not cacheable by default */
return (pass);
}
return (hash);
}
sub vcl_hash {
set req.http.X-Cookie-Hash = regsub(req.http.cookie, "KNOWN1=[^;]+;", "");
set req.http.X-Cookie-Hash = regsub(req.http.X-Cookie-Hash, "KNOWN2=[^;]+;", "");
hash_data(req.http.X-Cookie-Hash);
}
它会删除每个已知的 cookie 并对剩余部分进行哈希处理 :) 不理想,因为它不能保证 header 中 cookie 的顺序,但其他的应该有效。
情况::
- 即使请求中存在 cookie,Varnish 也需要缓存。
- 请求可能包含 N 个任意 cookie,其中某些已知 cookie 不得构成缓存键的一部分。任意 cookie 不包含任何用户敏感数据,例如。他们是像is_authenticated=1. 这样的美容小帮手
- 在缓存未命中的情况下,实际后端必须接收未受干扰的原始 cookie 集。
- 我不想在 VCL 中检查 URL 模式,因为这假设对后端有太多了解。
这出乎意料地难以解决。到目前为止,我发现的所有解决方案都假定 (2) 有一个白名单,而我需要一个黑名单。大多数解决方案都会删除本应传送到后端的 cookie。
那么(未测试):
# We use builtin.vcl logic and 'return' from our vcl_recv in order
# to prevent default Varnish behaviour of not caching with cookies present
sub vcl_recv {
# your vcl_recv starts here
# ...
# your vcl_recv ends here
if (req.method == "PRI") {
/* We do not support SPDY or HTTP/2.0 */
return (synth(405));
}
if (req.method != "GET" &&
req.method != "HEAD" &&
req.method != "PUT" &&
req.method != "POST" &&
req.method != "TRACE" &&
req.method != "OPTIONS" &&
req.method != "DELETE") {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe);
}
if (req.method != "GET" && req.method != "HEAD") {
/* We only deal with GET and HEAD by default */
return (pass);
}
if (req.http.Authorization) {
/* Not cacheable by default */
return (pass);
}
return (hash);
}
sub vcl_hash {
set req.http.X-Cookie-Hash = regsub(req.http.cookie, "KNOWN1=[^;]+;", "");
set req.http.X-Cookie-Hash = regsub(req.http.X-Cookie-Hash, "KNOWN2=[^;]+;", "");
hash_data(req.http.X-Cookie-Hash);
}
它会删除每个已知的 cookie 并对剩余部分进行哈希处理 :) 不理想,因为它不能保证 header 中 cookie 的顺序,但其他的应该有效。