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
。。。我会更新答案的技巧,绕过这一点。