php - Codeigniter : Varnish and Cookie/Session conflict

标签 php session caching varnish

我有一个依赖 session 和Cookie的网站。我想在其上实现Varnish缓存。

  • 打开浏览器时,网站具有相同的 session ID,直到关闭浏览器为止。但是 header 中的 AGE 值仍为 0 。此AGE值描述了 Varnish 是否在缓存页面。 0表示未缓存。
  • 要检查Varnish缓存是否正常工作,请使用 curl -I domainname ,我通过终端命中了此命令。 header 在每个HIT上为提供了不同的PHPSESSIONID ,AGE的值也保持为0。

    无法完全确定Varnish不允许网站缓存的内容。

    只是为了测试我 commented the session_start() ,这是以下观察结果。
    在浏览器上
  • 未在浏览器中创建 session ID cookie。
  • AGE在同一页面上的多个匹配中仍保持0。

  • 在终端上
  • 标题响应中未显示php session ID。
  • 第一次命中时的年龄值为0,但在后来的命中时,它始终获得递增的数值。

  • 看来Varnish无法缓存浏览器的点击量。特别是在指定域时。

    任何帮助如何使 Varnish 缓存适用于基于 session 的网站?

    最佳答案

    Varnish不会缓存默认情况下设置cookie的页面。有两种方法可以解决此问题:

  • 从页面中剥离cookie。仅在页面最初不需要 session (即没有用户特定内容)的情况下,这才对您有用。您可以这样做:
    // ... default.vcl
    sub vcl_recv {
      unset req.http.Cookie;
    
      return(hash);
    }
    
  • 将cookie添加到Varnish生成的哈希中,这将意味着每个 session 将拥有其自己的单独缓存(它仍将提高性能,但远不及选择选项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);
    }
    

  • 您可能有一些页面似乎没有用户特定的内容(例如,您有一个博客,博客文章不需要用户特定的内容),但是您可能有一些指示用户是否已登录的页面。如果您可以通过AJAX将其实现到非缓存的或按 session 缓存的端点,则一切正常。

    使用选项2,您可能会发现需要将Cookie临时存储在另一个 header 中,这样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即可。

    关于php - Codeigniter : Varnish and Cookie/Session conflict,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29793100/

    相关文章:

    php - 如何在 php 中将数组序列化为 url queryString?

    php - Joomla 插件在输出前获取整个页面的内容

    asp.net - 在 ASP.Net session 中保留对象

    google-app-engine - Google 应用引擎用户 Auth : Djangoappengine Vs Web2py Vs Webpy

    android picasso 无效不工作

    http - "Cache request directives"和 "Cache response directives"都需要吗?

    php - 缓存 AJAX 请求

    php - 非英语不支持来自 $.post jquery codeigniter 的 mysql 查询

    java - 如何有效销毁Java Servlet中的 'session'?

    php - 使用 Gmail 登录网站