需要缓存HTML文件的PHP响应


Need caching for PHP response for HTML files

我使用HTML模板为我的JS前端。当我请求HTML文件与一个"正常"的URL,如/public/templates/foo.html我得到HTML文件,下一次我重新加载它得到缓存。如果我使用/asset/templates这样的URL ?file=foo将调用PHP脚本并返回一个'text/html'文件(通过readfile())缓存不再工作。如何重新启用缓存?我在服务器上运行nginx。

这就是我得到的:

Cache-Control: private, max-age=900, pre-check=900
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html; charset=UTF-8
Date: Mon, 14 Sep 2015 17:13:16 GMT
Expires: Mon, 14 Sep 2015 17:28:16 GMT
Last-Modified: Sun, 13 Sep 2015 06:47:02 GMT
Pragma: no-cache
Server: nginx/1.4.6 (Ubuntu)
Transfer-Encoding: chunked

但是浏览器没有缓存它

是否使用session_start()启动会话?这将触发pragma no-cache;头。

您可以通过更改php.ini
中的以下内容来覆盖此功能会话。

会话。Cache_limiter指定会话页面使用的缓存控制方法。可以是以下值之一:nocache、private、private_no_expire或public。默认为nocache。另请参阅session_cache_limititer()文档,了解这些值的含义。

取自php手册

您有两个选择:

  1. 你可以在nginx上为PHP文件配置Cache-Control头。然后它们将变成可缓存的。这真是个坏主意,因为它会缓存所有php。考虑到PHP的动态特性,这是很少需要的,这也是为什么nginx默认情况下不缓存PHP响应的原因。
  2. 在PHP代码的开头添加以下内容:

    header ("Cache-Control: public, must-revalidate, max-age=86400")

它似乎也特定于nginx:添加以下行到你的nginx配置

proxy_ignore_headers "Cache-Control" "Expires" "Pragma";

否则nginx可能会根据nginx配置替换这些头(即忽略PHP脚本中的头)。