Codeigniter:清漆和Cookie /会话冲突

时间:2015-04-22 09:23:40

标签: php session caching varnish

我有一个依赖于会话和cookie的网站。我想在它上面实现Varnish缓存。

  1. 当浏览器打开时,网站会有相同的会话ID,直到浏览器关闭。但标题中的 AGE 值仍为 0 。此AGE值描述清漆是否缓存页面。 0表示不缓存。

  2. 要检查Varnish缓存是否有效, curl -I domainname 是命令,我通过终端点击此标题,标题提供不同的PHPSESSIONID 每个HIT和AGE的值也保持为0.

  3. 无法准确确定哪些内容不允许网站被Varnish缓存。

    只是为了测试我 commented the session_start() ,以下是观察结果。 在浏览器上

    1. 会话ID cookie未在浏览器中创建。
    2. AGE在同一页上的几次点击中仍为0。
    3. 在终端

      1. 标题回复中未显示php会话ID。
      2. 首次点击时年龄值为0,但在以后点击时,它会保持增量数值。
      3. 似乎Varnish无法缓存浏览器点击量。特别是在指定Domain时。

        任何帮助如何让varnish缓存适用于基于会话的网站?

1 个答案:

答案 0 :(得分:0)

Varnish默认不会缓存设置Cookie的网页。有两种方法可以解决这个问题:

  1. 从页面中删除Cookie。如果页面首先不需要会话(即它没有特定于用户的内容),这仅适用于您。你可以这样做:

    // ... default.vcl
    sub vcl_recv {
      unset req.http.Cookie;
    
      return(hash);
    }
    
  2. 将cookie添加到Varnish生成的哈希值中,这意味着每个会话都会拥有它自己的个人缓存(它仍然会带来性能提升,但远没有像你一样显着可以选择1.如此:

    // ... default.vcl
    sub vcl_hash {
      hash_data(req.url);
    
      if (req.http.host) {
        hash_data(req.http.host);
      } else {
        hash_data(server.ip);
      }
    
      hash_data(req.http.Cookie);
    
      return(lookup);
    }
    
  3. 您可能有一些页面似乎没有特定于用户的内容(比如说您有博客,博客文章不需要特定于用户的内容)但您可能有一些内容表明是否用户已登录。如果您可以通过AJAX将其发生到非缓存或每会话缓存端点,那么它将全部正常工作。

    使用选项2,您可能会发现需要将Cookie临时存储在另一个标题中,以便Varnish实际缓存页面,您可以这样做:

    // ... default.vcl
    sub vcl_recv {
      set req.http.X-Cookie = req.http.Cookie;
      unset req.http.Cookie;
    
      return(hash);
    }
    

    然后只需更改vcl_hash函数即可使用req.http.X-Cookie代替req.http.Cookie