基于用户代理的 Varnish 自定义html

标签 varnish

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

我知道我可以用JS实现类似的功能,但是对于我来说,要在服务器端实现它是不可靠的。

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

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

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

最佳答案

您需要做的就是修改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 自定义html,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52184292/

相关文章:

caching - 我如何防止Varnish在Plone前面缓存/login_form

php - Magento 中 Varnish 处于事件状态的 URL 检测

Varnish 正则表达式或 if (bereq.url ~ "

wordpress - Varnish Wordpress SSL Apache

ssl - 使用 Varnish 和 Nginx 作为 SSL 终止的 Magento 2 - 无限重定向

perl - 获取$ ENV奇怪的问题{'QUERY_STRING'}

varnish - Varnish 默认缓存 404s 吗?

php - Varnish `(pipe)` 和 `(pass)` 之间的区别

amazon-web-services - 有没有办法向AWS ELB中的所有实例发送http请求?

Varnish host_header不会发送到后端