我想基于$_SERVER['HTTP_USER_AGENT']
向用户显示不同的html样式。如何使用varnish设置实现此目的,使其具有特定用户代理的特定缓存。
我知道我可以用JS实现类似的东西,但这对我来说不可靠我想做服务器端。
我将在我的html中用来检测用户代理的php看起来像这样;
<?php if($_SERVER['HTTP_USER_AGENT'] == $target):?>
<style>
//CSS
</style>
<?php endif;?>
我怎样才能设置清漆,这样它可以很好地工作?
您需要做的就是修改vcl_hash
方法以向缓存键添加更多信息。
https://varnish-cache.org/docs/trunk/users-guide/vcl-hashing.html
sub vcl_hash {
hash_data(req.http.User-Agent);
}
请注意,用户代理字符串没有遵循真正的标准,因此即使对于相同的浏览器,变化也是巨大的。除非你自己控制用户代理(内部系统等),否则我会期望99%的缓存错过这种技术。
如果您想为移动设备使用不同的缓存,则以下可能会更成功,因为它会尝试检测移动浏览器,然后使用规范化的缓存键值来提高命中率:
sub vcl_hash {
if (req.http.User-Agent ~ "mobile") {
// hash_data
hash_data("mobile");
}
}
Varnish默认支持。您无需更改Varnish的配置。你只需要发送Vary header:
Vary HTTP响应头确定如何匹配未来的请求头以决定是否可以使用缓存的响应而不是从源服务器请求新的响应。
在您希望它根据User-Agent变化的特定情况下,Varnish将了解它需要为每个不同的User-Agent在缓存中创建相同对象的不同版本。
请注意,由于User-Agent标头的变化数量,使用不同的缓存可能会大大降低命中率。为避免这种情况,需要进行标准化。您可以在Varnish's documentation中阅读更多规范化用户代理标头