我正在将我托管的一些 Joomla 站点从 LAMP 堆栈移动到 LEMP 堆栈上。我已按照指南启动并运行 FastCGI 缓存,并且在文档根目录中使用单个 time.php 文件,我可以看到缓存正在工作。
但是,当我从同一个 Web 服务器加载我的 Joomla 站点时,缓存没有起作用。
如果我在访问 Joomla 网站的主页时使用 CURL 分析标题,我可以看到以下内容:
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
X-Cache: MISS
最后一个 X-Cache 条目是我作为指南的一部分添加的自定义标头,只是为了指示是否正在使用缓存。但是,其他两个条目必须在某个时候由 Joomla 生成,这似乎与缓存没有被使用有关。(当我 CURL 之前提到的 time.php 文件时,这两行丢失了,因为这不是 Joomla 站点的一部分。)
我知道这里可能发生了一些特定于 Joomla 的事情,所以我会问如何改变 Joomla 在 Joomla 论坛上的行为。
我对 SE 的问题略有不同:Cache-Control 和 Pragma 条目是否负责阻止我的站点使用 FastCGI 缓存,有什么我可以添加到 nginx conf 文件中来删除这些条目的吗?
两个问题,两个答案:
对,他们是。
实际上它是“Cache-Control”标头。在过去的 HTTP 1.0 中,“Pragma”标头从未设计为 HTTP 响应标头(应该只是 HTTP 请求标头)。
是的,你可以——但也许你不应该。
缓存私人内容可能会导致灾难,因为您可以向每个未知访问者显示 CMS 管理面板。您必须检查 CMS 是否为每个访问者创建了一个新会话,或者这是否仅适用于后端用户。如果 CMS 为每个访问者创建一个会话,我建议不要缓存。如果不是这种情况,但 CMS 提供了这些“不可缓存”标头,您可以使用 Nginx 覆盖此行为。
在我看来,您不应该在 Web 服务器中覆盖程序员在 CMS 代码中所做的事情。但我们并不生活在一个完美的世界里。很少有优秀的 CMS 编码人员知道他们在 Cache-Control 标头方面做了什么。
只要没有会话 cookie,我在这里描述的覆盖就会忽略 CMS 的 Cache-Control 标头。因此可以缓存公共页面。但是,如果客户端打开后端的登录页面,则会启动会话并设置会话 cookie。由于会话cookie,该客户端的所有后续请求都将在不使用缓存数据的情况下得到响应。
如何覆盖:
1) 您必须确定会话 cookie 的名称(例如 PHPSESSID)。
2) 调整你的 Nginx 配置。请参阅下面的示例:
3) 测试您的设置。