【发布时间】:2011-08-31 05:34:29
【问题描述】:
我是 Varnish 的新手,我想知道 Varnish 是否支持使用 http 标头进行缓存。 我们设计了一个基于 Rest 的 web 服务,我正在考虑使用 Varnish 来缓存结果。 一些请求信息(apikey)是如何通过 http 标头传递的,我想知道 Varnish 在检查传入请求(与查询字符串)时是否可以考虑到它。
【问题讨论】:
标签: varnish
我是 Varnish 的新手,我想知道 Varnish 是否支持使用 http 标头进行缓存。 我们设计了一个基于 Rest 的 web 服务,我正在考虑使用 Varnish 来缓存结果。 一些请求信息(apikey)是如何通过 http 标头传递的,我想知道 Varnish 在检查传入请求(与查询字符串)时是否可以考虑到它。
【问题讨论】:
标签: varnish
是的,你可以。应该如何考虑这个 API 密钥?如果您希望每个用户都有唯一的缓存条目,则仅当特定用户多次请求相同数据时才使用缓存。通过设置正确的 Cache-Control HTTP 响应标头(尽管不会重新验证数据新鲜度),您可以在不使用 varnish 之类的缓存代理的情况下取得长足进步。
在 Varnish 中至少有两种方法;
让您的应用程序返回一个 HTTP-Response 标头 Vary: apikey。这指示任何 HTTP 级别缓存(如 varnish)仅在 apikey 请求标头相同时重用缓存结果.
或者,更有效的是,修改 vcl 配置中的 vcl_hash 函数以考虑 apikey 标头。
sub vcl_hash { 设置 req.hash += req.http.apikey; }
【讨论】:
vcl_recv 的末尾加上return (hash); 以避免默认逻辑默认pass 所有带有Authorization 或Cookie 标头的请求.