关于这个Varnish VCL的几个问题

时间:2014-11-29 05:16:52

标签: ruby-on-rails caching mobile varnish varnish-vcl

我在Varnish 4.0.2中设置了varnish-devicedetect VCL:

https://github.com/varnish/varnish-devicedetect/blob/master/INSTALL.rst

我正在按照方法#1的说明:“将HTTP标头发送到后端”

我已经阅读了这篇自述文件,并且已经使用Google搜索了很长一段时间,但仍然有很多概念在逃避我。

这是我的代码(摘录):

default.vcl

include "devicedetect.vcl";

sub vcl_recv {
  call devicedetect;

  # ... snip ...
}

sub vcl_backend_response {
  # device detect
  if (bereq.http.X-UA-Device) {
    if (!beresp.http.Vary) { # no Vary at all
      set beresp.http.Vary = "X-UA-Device";
    } elseif (beresp.http.Vary !~ "X-UA-Device") { # add to existing Vary
      set beresp.http.Vary = beresp.http.Vary + ", X-UA-Device";
    }
  }

  # ... snip ...
}

sub vcl_deliver {
  # device detect
  if ((req.http.X-UA-Device) && (resp.http.Vary)) {
    set resp.http.Vary = regsub(resp.http.Vary, "X-UA-Device", "User-Agent");
  }

  # ... snip ...
}

这是我的问题。

  1. 当我在Chrome开发者工具中检查响应时,为什么Vary标头设置为User-Agent。方法#1的整个方法不是不使用用户代理,而是使用X-UA-Device?
  2. 基于我读过的其他指南...看来这将成为每种类型手机的起源(如果你看一下设备检测,它会分成...移动iphone,移动设备,移动设备,智能手机等)。这在上面的代码中是真的吗?对于任何给定的URL(桌面和移动设备......我绝对不想要对原始服务器点击两次以上...我不希望所有的移动设备 - *单独缓存)。
  3. 有人可以描述上面3个代码块实际上做了什么吗?有些外行人的说法。关于我唯一真正理解的是第一个代码块。 call devicedetect只需查看User-Agent,然后将X-UA-Device标头设置为对后端请求的相应分组。我对其他两个代码块的作用感到有些困惑。
  4. 如果我不打算让用户“使用桌面版网站”,我可以删除X-UA-Device-force位吗?
  5. 指南提到我应该在我的应用代码中设置后端。现在这就是我所拥有的(轨道)。我没有更改标题或更改有关响应的任何内容。我只是改变了HTML的外观(对于网站的移动版本)。我应该改变标题还是什么?这是我到目前为止所做的:
  6. Rails:

    def detect_device                                         
      if request.headers['X-UA-Device'] =~ /^mobile/          
        @device = 'mobile'                                    
        prepend_view_path Rails.root + 'app' + 'views_mobile' 
      else                                                    
        @device = 'desktop'                                   
      end                                                     
    end 
    

1 个答案:

答案 0 :(得分:1)

对于第1点,您的X-UA设备是内部消费的自定义标头,即默认情况下不会暴露给外部世界。为确保外部缓存/代理了解您正在考虑响应中的设备/用户代理,您必须使用反映此内容的标头更新Vary。这是用户代理进入的地方,就像你从中派生出X-UA-Device那样。

请注明您指明的链接中的评论

  

要保持任何缓存不会向其后面的客户端#2提供错误的内容,我们需要在出路时改变Vary。