Php 在缓存页面中包含req.http.referer

Php 在缓存页面中包含req.http.referer,php,ubuntu,varnish,Php,Ubuntu,Varnish,我有一个网站,只有少数几个来源的流量峰值。该站点还需要能够通过猜测用户是否刚刚使用PHPs$\u服务器[“HTTP\u REFERER”]到达该站点来向用户显示内容 是否可以在varnish缓存中包含req.http.referer的值,以便此行为更多地基于单个用户?我相信,由于另一个用户使用不同的referer值缓存内容,一些用户被显示了错误的内容。HTTP规范对此有解决方案。Vary响应标头指示在生成内容时考虑了哪些请求标头 在后端响应中添加一个“Vary:Referer”头,Varnish

我有一个网站,只有少数几个来源的流量峰值。该站点还需要能够通过猜测用户是否刚刚使用PHPs$\u服务器[“HTTP\u REFERER”]到达该站点来向用户显示内容


是否可以在varnish缓存中包含req.http.referer的值,以便此行为更多地基于单个用户?我相信,由于另一个用户使用不同的referer值缓存内容,一些用户被显示了错误的内容。

HTTP规范对此有解决方案。Vary响应标头指示在生成内容时考虑了哪些请求标头


在后端响应中添加一个“Vary:Referer”头,Varnish将为每个客户端提供正确的变体。

HTTP规范提供了解决方案。Vary响应标头指示在生成内容时考虑了哪些请求标头


在后端响应中添加一个“Vary:Referer”头,Varnish将为每个客户端提供正确的变量。

如果您希望所有引用上的缓存都不同,http协议Vary头是您的解决方案。如果您的流量与来自极少数唯一URL的引用不太一致,那么这实际上会降低缓存命中率

我认为更好的解决方案是从php层中删除猜测谁是新用户的逻辑,并将其添加到varnish中。这可以通过在vcl_recv中为请求设置一个自定义头,然后通过向vcl_recv添加类似的内容,使用该头在vcl_哈希中进行哈希来实现

if ((req.http.referer ~ "www.newuserhost1.com" || req.http.referer ~ "www.newuserhost2.com") &&
    req.url == "/") {
       req.http.X-New-User = 1;
}
并将其添加到vcl_散列中

 hash_data(req.http.X-New-User);

当用户到达后端时,您可以从那里检查X-New-user的值,而不是referer。

如果您希望所有referer上的缓存都不同,http protocols Variable标头是您的解决方案。如果您的流量与来自极少数唯一URL的引用不太一致,那么这实际上会降低缓存命中率

我认为更好的解决方案是从php层中删除猜测谁是新用户的逻辑,并将其添加到varnish中。这可以通过在vcl_recv中为请求设置一个自定义头,然后通过向vcl_recv添加类似的内容,使用该头在vcl_哈希中进行哈希来实现

if ((req.http.referer ~ "www.newuserhost1.com" || req.http.referer ~ "www.newuserhost2.com") &&
    req.url == "/") {
       req.http.X-New-User = 1;
}
并将其添加到vcl_散列中

 hash_data(req.http.X-New-User);

当用户到达您的后端时,您可以从那里检查X-New-user的值,而不是referer。

这很酷。所以我可以运行一个检查,看看引用者是否不是当前域吗?例如:
如果(req.http.referer!=req.http.href){req.http.X-New-User=1}
不完全正确,您的http.referer将包含一个完整的URL,如
href
不作为http头存在,req.http.host则不作为http头存在,但只包含主机名,因此您需要一个regex匹配,如
req.http.referer~req.http.host
这很酷。所以我可以运行一个检查,看看引用者是否不是当前域吗?例如:
如果(req.http.referer!=req.http.href){req.http.X-New-User=1}
不完全正确,您的http.referer将包含一个完整的URL,如
href
不作为http头存在,req.http.host则不作为http头存在,但只包含主机名,因此您需要一个regex匹配,如
req.http.referer~req.http.host