我可以通过从Varnish config调用PHP脚本来设置cookie值吗

我可以通过从Varnish config调用PHP脚本来设置cookie值吗,php,cookies,varnish,varnish-vcl,ab-testing,Php,Cookies,Varnish,Varnish Vcl,Ab Testing,问题是: 我有一个网站,由varnish缓存,我想在上面做一些a/B测试。为了做到这一点,varnish需要向一些人显示站点的一个版本(跨所有页面),而向其他人显示备选版本(跨所有页面),同时URL保持不变 我想让varnish读取一个包含散列值的cookie,并在此基础上向用户显示一个不同的缓存版本。我知道Varnish可以做到这一点,因为我已经在处理货币问题上做了类似的事情 现在的问题是: 我需要在访问者加载的第一个页面上设置此cookie值。当然,我需要尽可能高效地完成这项工作,而且我不希

问题是: 我有一个网站,由varnish缓存,我想在上面做一些a/B测试。为了做到这一点,varnish需要向一些人显示站点的一个版本(跨所有页面),而向其他人显示备选版本(跨所有页面),同时URL保持不变

我想让varnish读取一个包含散列值的cookie,并在此基础上向用户显示一个不同的缓存版本。我知道Varnish可以做到这一点,因为我已经在处理货币问题上做了类似的事情

现在的问题是: 我需要在访问者加载的第一个页面上设置此cookie值。当然,我需要尽可能高效地完成这项工作,而且我不希望重新加载页面(否则,如果没有设置cookie值,我可以进行一些javascript检查,如果没有设置,则执行ajax调用+页面刷新之类的操作)

我怎样才能做到这一点?是否可以让varnish检查cookie值,如果还没有设置任何内容(这应该只发生在访问者访问的第一个页面上),则调用一个PHP API(它将决定向哪种类型的人显示哪个版本等)?Varnish然后可以使用该值,并像cookie值已经存在一样继续。PHPAPI可以将返回值写入cookie,以便下一页加载

或者: 有没有更好的方法来达到我想要的行为


编辑:基本上,我正在寻找一种方法,用PHP脚本(或命令行命令)生成的值设置cookie,而不必让请求到达后端。

我认为还有其他/更好的方法来进行a\B测试,而不会对缓存造成影响。看看像VisualWebsiteOptimizer或Optimizely这样的工具,它们都是通过javascript实现的


还想自己建造吗?使用javascript或ESI块获取变体。特定的AJAX/ESI响应可能是不可缓存的,您可以允许将Cookie发送到此请求。

如果您确实希望Varnish这样做,而不是后端。您可以将其构建到内联C上的vmod中。如果您确实想运行命令行脚本,可以从C代码中调用popen()(内联或编译到vmod中)

以下是一个基本示例:

sub vcl_recv
{
    C{
       const struct gethdr_s hdr = { HDR_REQ, "\07Cookie:" };

       char str[128] = "";

       // Use popen() to run your command and save the result in str[]
       FILE *fp = popen("some_command_to_run", "r");
       if (fp)
       {
           fgets(str, sizeof(str) - 1, fp);
           fclose(fp);
       }

       // Add str as the value to the header
       VRT_SetHdr(ctx, &hdr, str, vrt_magic_string_end);
    }C

    ...
}

我不确定这是好是坏,这只是我在想,创建两个后端怎么样,实际上是一样的,但每个都会返回不同的版本和不同的头,这样varnish会分别缓存每个版本,比如
Vary:X-AB
,然后从后端1创建
X-AB:a
,从bac创建
X-AB:B
kend 2我想采用的A/B测试方法是新的,它在后端工作,允许进行更复杂的测试。缓存是实现这一点最重要的技术障碍,因此我的问题是.JS将取消我的解决方案所带来的好处。