基于用户代理的清漆自定义html

时间:2018-09-05 11:41:01

标签: varnish

我想基于$_SERVER['HTTP_USER_AGENT']向用户显示不同的html样式。如何使用清漆设置来实现此目的,以使其具有针对特定用户代理的特定缓存。

我知道我可以用JS实现类似的功能,但这对我来说不可靠,我想在服务器端进行。

我将在html中用于检测用户代理的php看起来像这样;

<?php if($_SERVER['HTTP_USER_AGENT'] == $target):?>
    <style>
      //CSS
    </style>    
    <?php endif;?>

如何设置清漆,使其与此配合使用?

2 个答案:

答案 0 :(得分:1)

您需要做的就是修改vcl_hash方法以向缓存键添加更多信息。

https://github.com/RitwikGA/FacebookReportingTool

sub vcl_hash {
    hash_data(req.http.User-Agent);
}

请注意,用户代理字符串没有遵循真正的标准,因此即使对于相同的浏览器,变化也很大。除非您自己控制用户代理(内部系统等),否则我预计这种技术会造成99%的缓存丢失。

如果您希望为移动设备使用不同的缓存,则以下尝试可能会更成功,因为它会尝试检测移动浏览器,然后使用规范化的缓存键值来提高命中率:

sub vcl_hash {
  if (req.http.User-Agent ~ "mobile") {
    // hash_data
    hash_data("mobile");
  }
}

答案 1 :(得分:1)

默认情况下,Varnish支持该功能。您无需更改Varnish的配置。您只需要发送Vary header

  

Vary HTTP响应标头确定如何匹配将来的请求标头,以决定是否可以使用缓存的响应,而不是向原始服务器请求新的响应。

在您希望它根据User-Agent变化的特定情况下,Varnish会了解到需要为每个不同的User-Agent在缓存中创建同一对象的不同版本。

请注意,由于User-Agent标头具有的变体数量,使用变体缓存可能会大大降低命中率。为了避免这种情况,需要进行标准化。您可以在Varnish's documentation

中阅读更多规范化的User-Agent标头