Fising's Blog

all about web application development

PHP Session 与浏览器缓存

今天被带教的同学问了一个有意思的问题:注册页面中的图形验证码,在开启关闭 session 后为何不能刷新呢?

看了一下他的代码:

根据经验,做验证码点击刷新,为了防止客户端缓存,我们会把新的验证码请求 URL 后添加随机数。例如:

这样的确可以解决问题。

但是有一点不明白,为何服务端 code.php 中开启了 session,原来的代码,不加随机 URL 参数就可以更新验证码呢,但是关闭了 session 却不可以?的确有点诡异。

通过开发者工具,可以看到,当关闭了 session 时,浏览器甚至都没有发起网络请求,看起来什么都没做。由此,基本上可以确定是因为这个时候触发了浏览器缓存。因为直接从本地缓存空间获取了内容,不再向服务端请求。

通过进一步比较开关 session 的情况下 code.php 的响应头,我们发现:在开启 session 的情况下,响应头中多了两行:


到这里就可以确认是响应头导致缓存导致浏览器对验证码图片文件有不同的缓存处理策略。

到这里还有个疑问,为什么开启了 session 就会多这两行 Response Header 呢?去源码找找看。

在 PHP 7 的 /ext/session/session.c 文件中,我们发现了下面的代码片段:CACHE_LIMITER_FUNC(nocache) /* {{{ */


原来,在开启 session 后 php 会自动向响应头中追加上面两行缓存控制的头信息,以防止浏览器进行缓存

, ,

发表评论