我正在使用 Gandi.net 的托管服务,最近他们开始做一些令人担忧的事情。他们正在缓存 PHP 程序的输出,显然是为了避免运行 PHP 代码,并在特定 IP 地址的用户请求页面时发送该输出。结果,我可以在 Firefox 中获取一个页面,例如打印我的用户代理的页面,它看起来很好,但如果我将该 URL 放入 Chrome 或 Safari 中,甚至使用 Curl 获取页面,我将看到我在 Firefox 中看到的输出。这与我认为 Web 服务器应该如何运行完全相反。毕竟,PHP 是一种编程语言,它可以每秒输出不同的 HTML。他们凭什么认为它会一直输出相同的数据并缓存它?顺便说一下,我的 PHP 文件的扩展名为 .php。
有没有办法解决这个缓存机制?例如,我可以告诉 PHP 在标头中放置一些内容来告诉缓存不要缓存 HTML 吗?
答案1
所有对 Gandi Simple Hosting 实例的请求都会经过Varnish缓存系统,因此,缓存响应的不是您的 Web 服务器,而是您的托管服务的记录缓存功能。
Simple Hosting 实例和 Web Accelerator 受益于由 Varnish 提供支持的强大缓存系统。这允许您将网站内容分发给更多访问者,而无需使用实例或服务器的资源。
本文档建议使用Cache-Control: max-age=1
,但Cache-Control: no-cache
甚至Cache-Control: private
(针对单个用户)都应该可以。(参见Cache-Control
。
例如,在 php 中:
header("Cache-Control: max-age=1");
如果您不想将其单独添加到每个 PHP 脚本中,则可以使用.htaccess
提供的解决方案,它也适用于服务器配置、虚拟主机和目录上下文:
如果是静态网站,则 .htaccess 文件的示例:
Header add Cache-Control "max-age=1"
为了完整性,下面是 Nginx 的一个例子,仅限于.php
文件:
location ~* \.php$ {
add_header Cache-Control "no-cache";
}
答案2
我找到了答案。让所有人都知道,无论高矮胖瘦,都有解决办法。
header ('Cache-Control: no-cache');