以下情况: 在服务器上是一个apache和Varnish用于缓存。 SSL由亚马逊负载均衡器处理。 如果使用https请求页面,则http标头“X-Forwarded-Proto”设置为“https”。 页面有时不同(例如,使用安全连接时必须使用https获取链接/图像)
如果X-Forwarded-Proto标头不同,如何告诉varnish页面是否不同? 就像现在一样,首先访问的是缓存并为http和https!
提供服务答案 0 :(得分:5)
我想,你想要的是拥有相同URI的不同缓存版本,使用自定义vcl_hash
非常容易:
sub vcl_hash {
# ...
if (req.http.X-Forwarded-Proto &&
req.url !~ "(?i)\.(png|gif|jpeg|jpg|ico|gz|tgz|bz2|tbz|mp3|ogg|zip|rar|otf|ttf|eot|woff|svg|pdf)$") {
hash_data(req.http.X-Forwarded-Proto);
}
# ...
}
在这个例子中,静态文件只缓存一次,其余的(html,js,css ..)缓存在2个不同的版本中(假设X-Forwarded-Proto只有两个值)。
您可以在https://github.com/NITEMAN/varnish-bites/blob/master/varnish3/drupal-base.vcl
的更广泛背景下看到该示例答案 1 :(得分:2)
问题和答案都很老了。
现在,最佳实践是利用Vary
标头(具有讽刺意味的是,这家伙建议谁在2015年删除答案)。
您应尽可能避免使用hash_data()
。
您的后端应该发送Vary: X-Forwarded-Proto,Accept-Encoding
。 Varnish服务器会看到标头并根据终止实例设置的标头中的协议创建单独的缓存条目。
答案 2 :(得分:0)
sub vcl_recv {
if ( req.http.X-Forwarded-Proto !~ "(?i)https") {
set req.http.x-Redir-Url = "http://" + ...req url;
}else{
set req.http.x-Redir-Url = "https://" + ...req url;
}
}
抱歉,我现在更新了代码。这就是我的意思。