Caching Varnish:缓存选项/CORS请求
如中所述,哈希键是基于请求的Caching Varnish:缓存选项/CORS请求,caching,cors,varnish,Caching,Cors,Varnish,如中所述,哈希键是基于请求的主机头或IP和URL计算的: sub vcl_hash { hash_data(req.url); if (req.http.host) { hash_data(req.http.host); } else { hash_data(server.ip); } return (lookup); } HTTP选项的正确缓存配置与相应的HTTP GET请求显然具有相同的URL、主机或IP curl -
主机
头或IP
和URL
计算的:
sub vcl_hash {
hash_data(req.url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
return (lookup);
}
HTTP选项
的正确缓存配置与相应的HTTP GET
请求显然具有相同的URL
、主机
或IP
curl -H "Origin: https://www.example.com" -I \
-H "Access-Control-Request-Method: GET" \
-X OPTIONS --verbose \
https://backend.server.example/rest/endpoint
另外,最好是缓存与也是CORS请求一部分的来源头相关的响应。尝试以下操作
为了确保OPTIONS
request方法可以被缓存,您需要调用vcl\u recv
过程中的return
语句,以便根本不运行vcl\u recv
。并对其进行一些更改:
sub-vcl\u recv{
如果(请求方法==“PRI”){
/*我们不支持SPDY或HTTP/2.0*/
返回(synth(405));
}
如果(请求方法!=“获取”&&
请求方法!=“头”&&
请求方法!=“放置”&&
请求方法!=“POST”&&
请求方法!=“跟踪”&&
请求方法!=“删除”){
/*非RFC2616或连接,这很奇怪*/
回流管;
}
如果(请求方法!=“获取”&&请求方法!=“头部”&&请求方法!=“选项”){
/*默认情况下,我们只处理GET和HEAD*/
返回(通行证);
}
if(req.http.Authorization | | req.http.Cookie){
/*默认情况下不可缓存*/
返回(通行证);
}
如果(请求方法==“获取”| |请求方法==“头部”| |请求方法==“选项”){
设置req.http.x-method=req.method;
}
返回(散列);
}
子vcl_后端_获取{
设置bereq.method=bereq.http.x-method;
}
为了使缓存根据原始标头值而不同,您将放置如下内容:
子vcl\u散列{
if(请求http.Origin){
散列数据(请求http.Origin);
}
#此处不返回,以便内置.vcl执行其默认行为,即缓存主机、URL等。
}
尝试以下操作
为了确保OPTIONS
request方法可以被缓存,您需要调用vcl\u recv
过程中的return
语句,以便根本不运行vcl\u recv
。并对其进行一些更改:
sub-vcl\u recv{
如果(请求方法==“PRI”){
/*我们不支持SPDY或HTTP/2.0*/
返回(synth(405));
}
如果(请求方法!=“获取”&&
请求方法!=“头”&&
请求方法!=“放置”&&
请求方法!=“POST”&&
请求方法!=“跟踪”&&
请求方法!=“删除”){
/*非RFC2616或连接,这很奇怪*/
回流管;
}
如果(请求方法!=“获取”&&请求方法!=“头部”&&请求方法!=“选项”){
/*默认情况下,我们只处理GET和HEAD*/
返回(通行证);
}
if(req.http.Authorization | | req.http.Cookie){
/*默认情况下不可缓存*/
返回(通行证);
}
如果(请求方法==“获取”| |请求方法==“头部”| |请求方法==“选项”){
设置req.http.x-method=req.method;
}
返回(散列);
}
子vcl_后端_获取{
设置bereq.method=bereq.http.x-method;
}
为了使缓存根据原始标头值而不同,您将放置如下内容:
子vcl\u散列{
if(请求http.Origin){
散列数据(请求http.Origin);
}
#此处不返回,以便内置.vcl执行其默认行为,即缓存主机、URL等。
}
我试过了,但似乎启用选项的缓存
请求以某种方式被转换为GET
后端回迁。正因为如此,当我通过varnish发出请求时,与直接命中后端相比,头部有所不同。有什么想法吗?当您在vcl\u recv
中return(hash)
时,Varnish似乎会将请求转换为GET
。。。我将使用绕过该选项的技巧更新答案。我尝试过,但似乎启用选项
请求的缓存以某种方式被转换为获取
后端获取。正因为如此,当我通过varnish发出请求时,与直接命中后端相比,头部有所不同。有什么想法吗?当您在vcl\u recv
中return(hash)
时,Varnish似乎会将请求转换为GET
。。。我会更新答案的技巧,绕过这一点。